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' 等)。不幸的是,我找不到任何方法来迭代列列表或更改列名,而无需首先能够通过名称明确引用列。
在您的对象中设置spark.sql.caseSensitive为trueSparkConf
val sparkConf = new SparkConf().setAppName("Test App")
sparkConf.set("spark.sql.caseSensitive", "true")
Run Code Online (Sandbox Code Playgroud)