为什么 createDataFrame 的推断器不将此数据创建为字符串的列?



以下代码显示了如何构建数据帧。可以看出,数据帧由两列组成。 每列的最后一行都有整数和一个字符串。

据我了解,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,我得到了完全相同的结果。知道为什么会这样吗?

发生这种情况是因为从本地数据结构创建DataFramesamplingRatio参数被完全忽略。仅当dataRDD时才使用它。否则,数据将转换为 Java RDD,而不匹配类型的对象将转换为空值。

如果您传递RDD而不是列表,Spark将应用模式推理并抛出异常,与Scala中相同。发生这种情况是因为 Spark 不支持混合类型,并且不执行自动转换。

为什么inferSchema争论存在?它看起来像是在 Python 字典中构建RDDs弃用推理的工件。但这只是一个疯狂的猜测。

相关内容

  • 没有找到相关文章

最新更新