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

Apache spark 在pyspark 2.3中,如何处理json模式推断后不区分大小写导致的不明确列名?,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,在Pyspark 2.3中,假设我有一个JSON文档,如下所示: { "key1": { "key2": "abc", "KEY2": "def" } } pyspark.sql.utils.AnalysisException: 'Ambiguous reference to fields StructField(key2,StringType,true), StructField(KEY2,StringType,true);' 实际上,我有几十亿个

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

{
   "key1": {
       "key2": "abc",
       "KEY2": "def"
    }
}
pyspark.sql.utils.AnalysisException: 'Ambiguous reference to fields StructField(key2,StringType,true), StructField(KEY2,StringType,true);'
实际上,我有几十亿个这样的文档,每个文档都可能有数百甚至数千个深度嵌套的结构,这些结构会定期发生变化。但这个简单的文档说明了这个问题

如果我这样做:

df = session.read.json(<file>)
df.select('key1.key2')
df.select('key1.KEY2')
由于模式的广度及其不断变化的性质,通过StructType结构硬编码模式是不切实际的

我如何处理这种情况?理想情况下,我会有一种方法来重命名重复的列,这样它们就不会发生冲突,例如“key2\u 0”、“key2\u 1”等。不幸的是,我找不到任何方法来迭代列列表或更改列名,而不首先能够通过名称明确地引用列。

您尝试过下面的方法吗

spark.sql("set spark.sql.caseSensitive=true")
在SparkConf对象中将spark.sql.caseSensitive设置为true

不是直接复制的。这是关于scala的。这是关于Pypark的。在这两方面都有经验的人可以做翻译,但这个答案并不能直接回答问题。
val sparkConf = new SparkConf().setAppName("Test App")
sparkConf.set("spark.sql.caseSensitive", "true")