使用 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 文件中列名中的空格的主要内容,如果未能解决你的问题,请参考以下文章
使用 spark-sql cli 将 csv 数据直接加载到 parquet 表中