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

Why does the inferrer of createDataFrame doesn't create columns this data as strings?

以下代码显示了如何构建数据帧。可以看出数据框包含两列。每列在最后一行都有整数和一个字符串。

据我了解,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|
#+----+----+

根据@cceneson 的建议,我决定重新运行 删除参数samplingRatio 的代码,我得到了完全相同的结果。知道为什么会这样吗?

这是因为当从本地数据结构创建 DataFrame 时,samplingRatio 参数被完全忽略。 It is used only if data is a RDD。否则数据将转换为 Java RDD,并且类型不匹配的对象将转换为空值。

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

为什么 inferSchema 论点存在?它看起来像是对 RDDs 构建的 Python 词典的弃用推理的产物。但这只是一个大胆的猜测。