在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")
在 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")