首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark中区分大小写的拼图模式合并

Spark中区分大小写的拼图模式合并
EN

Stack Overflow用户
提问于 2019-07-31 19:25:39
回答 1查看 3.7K关注 0票数 4

我正在试着用Spark加载和分析一些镶木地板文件。我使用schemaMerge加载文件,因为较新的文件有一些额外的列。此外,一些文件的列名是小写的,而其他文件的列名是大写的。

例如

file1.parquet的模式如下所示

代码语言:javascript
复制
column1 integer,
column2 integer

file2.parquet有一些类似的东西:

代码语言:javascript
复制
Column1 integer,
Column2 integer,
Column3 integer

我遇到了一个关于ParquetFileFormat类的inferSchema方法的问题。模式合并被委托给spark sql的StructType merge方法。据我所知,该方法只能以区分大小写的方式工作。在内部,它使用映射按名称查找字段,如果大小写不匹配,它会将其解释为新字段。稍后,当检查模式中的重复项时,区分大小写的配置会被考虑在内,我们最终会得到重复的列。这会导致

代码语言:javascript
复制
org.apache.spark.sql.AnalysisException: Found duplicate column(s) in the data schema

有没有办法使模式合并不区分大小写?

我希望得到的结果模式是这样的:

代码语言:javascript
复制
column1 integer,
column2 integer,
Column3 integer
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-31 20:22:49

您可以在配置中设置spark.sql.caseSensitive=true,使Spark SQL schema区分大小写。它还会影响模式合并。

代码语言:javascript
复制
scala> spark.conf.set("spark.sql.caseSensitive","true")

scala> val df = sc.parallelize(1 to 1000).toDF()
df: org.apache.spark.sql.DataFrame = [value: int]

scala> df.withColumnRenamed("value","VALUE").write.parquet("test_uc")

scala> df.write.parquet("test_lc")

scala> val df2=spark.read.option("mergeSchema","true").parquet("test_*")
df2: org.apache.spark.sql.DataFrame = [value: int, VALUE: int]

scala> val merged = df2.columns.groupBy(_.toLowerCase)
                   .map(t => coalesce(t._2.map(col):_*).as(t._1))
                   .toArray
merged: Array[org.apache.spark.sql.Column] = Array(coalesce(value, VALUE) AS `value`)

scala> df2.select(merged:_*)
res2: org.apache.spark.sql.DataFrame = [value: int]

scala> spark.conf.set("spark.sql.caseSensitive","false")

// process your dataframe
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57289669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档