[英]Does Schema depend on first row while converting RDD to DataFrame in pyspark?
我的問題是在從pyspark中的Rdd轉換為dataframe時,架構是否取決於第一行?
data1 = [('A','abc',0.1,'',0.562),('B','def',0.15,0.5,0.123),('A','ghi',0.2,0.2,0.1345),('B','jkl','',0.1,0.642),('B','mno',0.1,0.1,'')]
>>> val1=sc.parallelize(data1).toDF()
>>> val1.show()
+---+---+----+---+------+
| _1| _2| _3| _4| _5|
+---+---+----+---+------+
| A|abc| 0.1| | 0.562| <------ Does it depends on type of this row?
| B|def|0.15|0.5| 0.123|
| A|ghi| 0.2|0.2|0.1345|
| B|jkl|null|0.1| 0.642|
| B|mno| 0.1|0.1| null|
+---+---+----+---+------+
>>> val1.printSchema()
root
|-- _1: string (nullable = true)
|-- _2: string (nullable = true)
|-- _3: double (nullable = true)
|-- _4: string (nullable = true)
|-- _5: double (nullable = true)
如您所見,列_4應該已經為double,但它被視為string 。
任何建議都會有所幫助。 謝謝!
@Prathik,我想你是對的。 toDF()
是spark.createDataFrame(rdd, schema, sampleRatio)
的簡寫。
這是createDataFrame
的簽名:
def createDataFrame(self, data, schema=None, samplingRatio=None, verifySchema=True)
因此,默認情況下,參數schema
和samplingRatio
為None
。 根據文檔 :
如果需要的模式推斷,
samplingRatio
用於用於架構推斷行的確定的比率。 如果samplingRatio
為None
則將使用第一行。
因此,默認情況下, toDF()
將使用第一行來推斷數據類型,它在第4列中使用StringType
,在第5列中使用FloatType
。
在這里,您不能將第4列和第5列指定為FloatType
架構,因為它們的列中都有字符串。 但是您可以嘗試將sampleRatio
設置為0.3
,如下所示:
data1 = [('A','abc',0.1,'',0.562),('B','def',0.15,0.5,0.123),('A','ghi',0.2,0.2,0.1345),('B','jkl','',0.1,0.642),('B','mno',0.1,0.1,'')]
val1=sc.parallelize(data1).toDF(sampleRatio=0.3)
val1.show()
val1.printSchema()
有時上述代碼有時會在采樣字符串行時拋出錯誤
Can not merge type <class 'pyspark.sql.types.DoubleType'> and <class 'pyspark.sql.types.StringType'>
但是如果您有耐心並且嘗試更多次(對我來說<10),您可能會得到類似的信息。 您會看到第4列和第5列都是FloatType
,因為幸運的是,該程序在運行createDataFrame
選擇了double
FloatType
數字。
+---+---+----+----+------+
| _1| _2| _3| _4| _5|
+---+---+----+----+------+
| A|abc| 0.1|null| 0.562|
| B|def|0.15| 0.5| 0.123|
| A|ghi| 0.2| 0.2|0.1345|
| B|jkl|null| 0.1| 0.642|
| B|mno| 0.1| 0.1| null|
+---+---+----+----+------+
root
|-- _1: string (nullable = true)
|-- _2: string (nullable = true)
|-- _3: double (nullable = true)
|-- _4: double (nullable = true)
|-- _5: double (nullable = true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.