2016-04-01 11 views
2

私はpythonでスパークを使用しています.CSVファイルをアップロードした後、22桁の番号を持つCSVファイル内の列を解析する必要がありました。その列を解析するために、LongType()を使用しました。私は、列を定義するためにmap()関数を使用しました。 以下は私のコマンドがpysparkであることです。pysparkの大きな数値を処理するデータ型

>>> test=sc.textFile("test.csv") 
>>> header=test.first() 
>>> schemaString = header.replace('"','') 
>>> testfields = [StructField(field_name, StringType(), True) for field_name in schemaString.split(',')] 
>>> testfields[5].dataType = LongType() 
>>> testschema = StructType(testfields) 
>>> testHeader = test.filter(lambda l: "test_date" in l) 
>>> testNoHeader = test.subtract(testHeader) 
>>> test_temp = testNoHeader.map(lambda k: k.split(",")).map(lambda 
p:(p[0],p[1],p[2],p[3],p[4],***float(p[5].strip('"'))***,p[6],p[7])) 
>>> test_temp.top(2) 

注:私も変数test_tempで「フロート」の代わりに「長い」と「BIGINT」を試してみましたが、スパークにエラーとなった を「キーワードが見つからない」そして次があります次のように出力

[('2012-03-14', '7', '1698.00', 'XYZ02abc008793060653', 'II93', ***8.27370028700801e+21*** , 'W0W0000000000007', '879870080088815007'), ('2002-03-14', '1', '999.00', 'ABC02E000050086941', 'II93', 8.37670028702205e+21, 'A0B0080000012523', '870870080000012421')] 

は私のcsvファイルの値は次のとおりです。 8.27370028700801e + 21はです私はそれのうちデータフレームを作成し、それを照会する場合8.37670028702205e + 21は

>>> test_df = sqlContext.createDataFrame(test_temp, testschema) 
>>> test_df.registerTempTable("test") 
>>> sqlContext.sql("SELECT test_column FROM test").show() 

test_column

は、すべてのレコードに対して 'NULL' 値を与える、

です。

だから、スパークに大きな数を解析するこの問題を解決する方法を本当に

答えて

3

まあ、種類は問わあなたの助けに感謝します。データをfloatに変換するため、DataFrameにはLongTypeを使用できません。 PySparkはタイプに関して比較的寛容であるので、それは吹くだけではありません。

を:

また、8273700287008010は、あなたがしたい場合は、DoubleTypeを使用する必要がありますDataFrameにあなたのデータに-9223372036854775808と

9223372036854775807間のみ値を表すことができLontTypeとして表現するには大にあります

from pyspark.sql.types import * 

rdd = sc.parallelize([(8.27370028700801e+21,)]) 
schema = StructType([StructField("x", DoubleType(), False)]) 
rdd.toDF(schema).show() 

## +-------------------+ 
## |     x| 
## +-------------------+ 
## |8.27370028700801E21| 
## +-------------------+ 

は通常、直接DataFramesでこれを処理するために、良いアイデアです:

from pyspark.sql.functions import col 

str_df = sc.parallelize([("8273700287008010",)]).toDF(["x"]) 
str_df.select(col("x").cast("double")).show() 

## +-------------------+ 
## |     x| 
## +-------------------+ 
## |8.27370028700801E21| 
## +-------------------+ 

あなたが指定した精度でDecimalにキャストすることができますDouble使用したくない場合は、次の

str_df.select(col("x").cast(DecimalType(38))).show(1, False) 

## +----------------------+ 
## |x      | 
## +----------------------+ 
## |8273700287008010| 
## +----------------------+ 
関連する問題