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

In pyspark 2.3, how can I deal with ambiguous column names caused by case insensitivity after json schema inference?

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

{
   "key1": {
       "key2": "abc",
       "KEY2": "def"
    }
}

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

如果我这样做:

df = session.read.json(<file>)
df.select('key1.key2')
df.select('key1.KEY2')

两次选择都会失败,并出现如下错误:

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

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

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

下面你试过了吗

spark.sql("set spark.sql.caseSensitive=true")

在您的 SparkConf 对象

中将 spark.sql.caseSensitive 设置为 true
val sparkConf = new SparkConf().setAppName("Test App")
sparkConf.set("spark.sql.caseSensitive", "true")