在pyspark中将RDD转换为DataFrame时,Schema是否依赖于第一行?

时间:2019-07-12 13:59:40

标签: python apache-spark pyspark rdd

我的问题是在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

  

任何建议都会有所帮助。   谢谢!

1 个答案:

答案 0 :(得分:1)

@Prathik,我认为您是对的。 toDF()spark.createDataFrame(rdd, schema, sampleRatio)的简写。

这是createDataFrame的签名:

def createDataFrame(self, data, schema=None, samplingRatio=None, verifySchema=True)

因此,默认情况下,参数schemasamplingRatioNoneAccording to the doc

  

如果需要模式推断,则使用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,因为幸运的是,程序在运行double时选择了createDataFrame个数字。

+---+---+----+----+------+
| _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)