在pyspark 2.3中,如何处理json模式推断后不区分大小写导致的列名不明确?

Jar*_*red 0 apache-spark pyspark pyspark-sql

在 Pyspark 2.3 中,假设我有一个如下所示的 JSON 文档:

{
   "key1": {
       "key2": "abc",
       "KEY2": "def"
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,我有数十亿个这样的文档,每个文档都有可能有数百(甚至数千)个周期性变化的深度嵌套结构。但是这个简单的文档说明了这个问题。

如果我做:

df = session.read.json(<file>)
df.select('key1.key2')
df.select('key1.KEY2')
Run Code Online (Sandbox Code Playgroud)

两个选择都将失败并显示如下错误:

pyspark.sql.utils.AnalysisException: 'Ambiguous reference to fields StructField(key2,StringType,true), StructField(KEY2,StringType,true);'
Run Code Online (Sandbox Code Playgroud)

由于模式的广度及其不断变化的性质,通过 StructType 结构对模式进行硬编码是不切实际的。

我该如何处理这种情况?理想情况下,我有一种方法可以重命名重复的列,这样它们就不会发生冲突(例如,'key2_0'、'KEY2_1' 等)。不幸的是,我找不到任何方法来迭代列列表或更改列名,而无需首先能够通过名称明确引用列。

Pra*_*ode 5

在您的对象中设置spark.sql.caseSensitivetrueSparkConf

val sparkConf = new SparkConf().setAppName("Test App")
sparkConf.set("spark.sql.caseSensitive", "true")
Run Code Online (Sandbox Code Playgroud)