2016-04-01 44 views
2

我在python中使用了spark。在上傳csv文件後,我需要解析csv文件中有22位數字的數字的列。爲解析該列,我使用了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) 

注:我也嘗試過「長」和「BIGINT」到位「浮動」在我的變量test_temp,但在火花的錯誤是「關鍵詞未找到」 而以下是輸出

[('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對價 '空' 的所有記錄。

那麼,如何解決火花解析大數目的這個問題,真的很感謝你的幫助

回答

3

好,種類無所謂。由於您將數據轉換爲float,因此您不能在DataFrame中使用LongType。它不僅僅是因爲PySpark在類型方面相對寬容。

此外,8273700287008010是大而不能表示爲LontType可如果你想-9223372036854775808和9223372036854775807

之間僅代表值數據爲DataFrame你將不得不使用DoubleType

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| 
## +-------------------+ 

如果你不想使用Double可以轉換爲Decimal與指定的精度:

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

## +----------------------+ 
## |x      | 
## +----------------------+ 
## |8273700287008010| 
## +----------------------+