解決ValueError: Some of types cannot be determined by the first 100 rows,


在spark中試圖將RDD轉換成DataFrame時,有時會提示ValueError: Some of types cannot be determined by the first 100 rows, please try again with sampling

原因

RDD中元素的內部結構是未知的、不明確的,也就是說每個元素里面有哪些字段,每個字段是什么類型,這些都是不知道的,而DataFrame則要求對元素的內部結構有完全的知情權。

但是在前100行的數據采樣過程中還是無法確定字段的類型,所以就會提示這個。

 

解決辦法

一、提高數據采樣率(sampling ratio)

sqlContext.createDataFrame(rdd, samplingRatio=0.2)

其中的samplingRatio參數就是數據采樣率,可以先設置為0.2試試,如果不行,可以繼續增加。

該方法的缺點在於,數據抽樣確定類型之后,如果后續類型發生變化,則會導致程序崩潰,抽樣檢測完成還是無法確定類型,依舊會崩潰

所以就有了下面的解決方案。

 

二、顯式聲明要創建的DataFrame的數據結構,即schema。

  

#首先引入類型和方法,具體有StructType, StructField, StringType, IntegerType等方法,處理不同的數據類型
from
pyspark.sql.types import *
#構建 schema
schema = StructType([ StructField("column_1", StringType(), True), StructField("column_2", IntegerType(), True) . . . ])
#傳入聲明
df = sqlContext.createDataFrame(rdd, schema=schema)

當顯式聲明schema並應用到createDataFrame方法中后,就不再需要samplingRatio參數了。

實際開發工程中建議使用顯式聲明schema的方案,這樣可以避免出現因奇葩數據導致的錯誤。

 

 

作者:舊舊的 <393210556@qq.com> 解決問題的方式,就是解決它一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM