Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark中区分大小写的拼花图案合并_Apache Spark_Parquet - Fatal编程技术网

Apache spark Spark中区分大小写的拼花图案合并

Apache spark Spark中区分大小写的拼花图案合并,apache-spark,parquet,Apache Spark,Parquet,我正在尝试用Spark加载和分析一些拼花文件。 我正在使用schemaMerge加载文件,因为较新的文件有一些额外的列。此外,一些文件的列名用小写,而另一些文件的列名用大写 比如说 file1.parquet的模式如下 column1 integer, column2 integer 和file2.parquet有如下功能: Column1 integer, Column2 integer, Column3 integer 我遇到了一个关于ParquetFileFormatclass的inf

我正在尝试用Spark加载和分析一些拼花文件。 我正在使用
schemaMerge
加载文件,因为较新的文件有一些额外的列。此外,一些文件的列名用小写,而另一些文件的列名用大写

比如说

file1.parquet
的模式如下

column1 integer,
column2 integer
file2.parquet
有如下功能:

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

org.apache.spark.sql.AnalysisException: Found duplicate column(s) in the data schema
有没有办法使模式合并不区分大小写

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

column1 integer,
column2 integer,
Column3 integer

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

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

对不起,我不清楚我的期望是什么。我希望合并能够以不区分大小写的方式工作,或者直接在Spark中有一个选项。所以“value”和“value”最终将是同一列。我想那是不可能的。我会试试你的变通办法。我想知道,既然select设置为区分大小写,那么它是否会在具有不同架构大小写的文件中正确运行。我现在看到了应该处理这些多个文件的合并。谢谢如果不区分大小写,则由于AnalysisException无法读取文件,因此必须设置区分大小写并“手动”合并列,如我的示例所示。请注意,这是一个简单的元数据争论,因此相关成本很低。读取文件后,可以将区分大小写设置为false。我将更新示例以使其更清晰。