使用 spark sql 重命名 Parquet 文件中列名中的空格

Posted

技术标签:

【中文标题】使用 spark sql 重命名 Parquet 文件中列名中的空格【英文标题】:Rename whitespace in column name in Parquet file using spark sql 【发布时间】:2018-09-16 15:26:49 【问题描述】:

我想使用 Spark Sql 显示 parquet 文件的内容,但由于 parquet 文件中的列名包含空格,我收到错误 - 属性名称“First Name”在“,;()\n\t=" 中包含无效字符。请使用别名重命名。;

我已经写了下面的代码 -

val r1 = spark.read.parquet("filepath")
val r2 = r1.toDF()
r2.select(r2("First Name").alias("FirstName")).show()

但仍然出现同样的错误

【问题讨论】:

这能回答你的问题吗? Spark Dataframe validating column names for parquet writes 【参考方案1】:

尝试先重命名列而不是别名:

r2 = r2.withColumnRenamed("First Name", "FirstName")
r2.show()

【讨论】:

【参考方案2】:

对于仍在寻找答案的任何人, 在处理 parquet 数据时,没有优化的方法可以从列名中删除空格。

可以做的是:

在源本身更改列名,即在创建 parquet 数据本身时。

(不是优化方式 - 不适用于庞大的数据集) 使用 pandas 读取 parquet 文件并重命名 pandas 数据框的列。如果需要,请使用 pandas 本身将数据帧写回 parquet,然后根据需要使用 spark 进行处理。

PS:随着 PySpark 3.2 中计划推出的用于 PySpark 的新 Pandas API,在处理大型数据集时,使用 spark 实现 pandas 可能会更快并得到优化。

【讨论】:

【参考方案3】:

对于任何为此苦苦挣扎的人,唯一对我有用的是:

for c in df.columns:
    df = df.withColumnRenamed(c, c.replace(" ", ""))

df = spark.read.schema(base_df.schema).parquet(filename)

这是来自这个帖子:Spark Dataframe validating column names for parquet writes (scala)

别名、withColumnRenamed 和“as”sql 选择语句不起作用。每当尝试 .show() 数据框时,Pyspark 仍会使用旧名称。

【讨论】:

我用这个的时候,列中的数据被删除(列为空) 这不起作用。如果您检查 df.schema 您会发现它没有引用原始列名,因此在读取它时找不到列,因此所有值都是空的。到目前为止,我发现的唯一解决方案是使用 pandas 读取,重命名列,然后将其写入 spark。如果您的数据对于 pandas 来说太大,这可能不起作用。

以上是关于使用 spark sql 重命名 Parquet 文件中列名中的空格的主要内容,如果未能解决你的问题,请参考以下文章

使用别名重命名 pyspark 列

Parquet + Spark SQL

Spark SQL下的Parquet使用最佳实践和代码实战

使用 spark-sql cli 将 csv 数据直接加载到 parquet 表中

Spark基础学习笔记25:Spark SQL数据源 - Parquet文件

Spark SQL 中的 Parquet 文件