簡體   English   中英

在pyspark中將RDD轉換為DataFrame時,Schema是否依賴於第一行?

[英]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)

因此,默認情況下,參數schemasamplingRatioNone 根據文檔

如果需要的模式推斷, samplingRatio用於用於架構推斷行的確定的比率。 如果samplingRatioNone則將使用第一行。

因此,默認情況下, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM