2017-05-31 26 views
1

我有一個大型的DataFrame由〜550列的雙打和兩列長(ids)組成。從csv讀取550列,並添加兩個id列。唯一的其他東西,我用數據做的是一些從字符串CSV數據更改爲雙打 - 0(「INF」>「0」,則轉換列一倍)和替換NaN的:如何增加Spark中的小數精度?

df = df.withColumn(col.name + "temp", 
          regexp_replace(
           regexp_replace(df(col.name),"Inf","0") 
           ,"NaN","0").cast(DoubleType)) 
df = df.drop(col.name).withColumnRenamed(col.name + "temp",col.name) 
df = df.withColumn("timeId", monotonically_increasing_id.cast(LongType)) 
df = df.withColumn("patId", lit(num).cast(LongType)) 
df = df.na.fill(0) 

當我做一個數,我得到以下錯誤:

IllegalArgumentException: requirement failed: Decimal precision 6 exceeds max precision 5 

有行數十萬,而我從多個CSV的數據讀取。如何提高小數精度?還有什麼可以繼續嗎?我在閱讀某些csvs時只會遇到這個錯誤。他們可以比其他人有更多的小數?

回答

1

我認爲這個錯誤很自我解釋 - 你需要使用DecimalType而不是DoubleType

試試這個:閱讀

... .cast(DecimalType(6)))

https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/sql/types/DecimalType.html

http://spark.apache.org/docs/2.0.2/api/python/_modules/pyspark/sql/types.html

datatype for handling big numbers in pyspark

+0

哈哈。對於「自解釋」的某些定義... –

+0

謝謝! [如果你感興趣,這是一個後續行動](https://stackoverflow.com/questions/44296484/how-do-i-set-infinite-or-nan-values-to-0-in-spark) –