我的问题是在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 。
任何建议都会有所帮助。 谢谢!
答案 0 :(得分:1)
@Prathik,我认为您是对的。
toDF()
是spark.createDataFrame(rdd, schema, sampleRatio)
的简写。
这是createDataFrame
的签名:
def createDataFrame(self, data, schema=None, samplingRatio=None, verifySchema=True)
因此,默认情况下,参数schema
和samplingRatio
为None
。
According to the doc:
如果需要模式推断,则使用
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
,因为幸运的是,程序在运行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)