以下代码显示了如何构建数据帧。可以看出,数据帧由两列组成。 每列的最后一行都有整数和一个字符串。
据我了解,createDataFrame必须分析列的数据类型(以及行中的数据类型(。然后,假设一种可以包含所有行的数据类型。在这种情况下,我认为列必须是字符串数据类型,因为这种类型可以包含数字和字符串。
因此,为什么生成的 dataFrame 具有长数据类型的列并且字符串无效?
# DataFrame construction:
b = sqlContext.createDataFrame([(1, 2),(2, 3), (3, 3), ('test0', 'test1')], ['pepe', 'pepa'], samplingRatio=1)
b.show()
#+----+----+
#|pepe|pepa|
#+----+----+
#| 1| 2|
#| 2| 3|
#| 3| 3|
#|null|null|
#+----+----+
在@ccheneson的建议下,我决定重新运行代码,删除参数samplingRatio
,我得到了完全相同的结果。知道为什么会这样吗?
发生这种情况是因为从本地数据结构创建DataFrame
时samplingRatio
参数被完全忽略。仅当data
是RDD
时才使用它。否则,数据将转换为 Java RDD,而不匹配类型的对象将转换为空值。
如果您传递RDD
而不是列表,Spark将应用模式推理并抛出异常,与Scala中相同。发生这种情况是因为 Spark 不支持混合类型,并且不执行自动转换。
为什么inferSchema
争论存在?它看起来像是在 Python 字典中构建RDDs
弃用推理的工件。但这只是一个疯狂的猜测。