python – 为什么createDataFrame的推理者不会将这些数据作为字符串创建列?

以下代码显示了如何构建dataFrame.可以看出,数据帧包括两列.每列都有整数,最后一行有一个字符串.

据我了解,createDataFrame必须分析列的数据类型(因此在行中).然后,假设一个数据类型可以包含所有行.在这种情况下,我认为列必须是字符串数据类型,因为此类型可以包含数字和字符串.

因此,为什么生成的dataFrame具有long数据类型的列并且字符串无效?

# 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参数.
It is used only if data is a RDD.否则,数据将转换为Java RDD,不匹配类型的对象将转换为空值.

如果您传递RDD而不是列表,Spark将应用模式推断并抛出异常,例如在Scala中.这是因为Spark不支持混合类型,也不执行自动转换.

为什么inferSchema论证存在?它看起来像是在Python字典构建的RDD上不推荐推断的工件.但这只是一个疯狂的猜测.

点赞