【问题标题】:Rename whitespace in column name in Parquet file using spark sql使用 spark sql 重命名 Parquet 文件中列名中的空格
【发布时间】: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()

但仍然出现同样的错误

【问题讨论】:

标签: apache-spark-sql parquet


【解决方案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 来说太大,这可能不起作用。
      猜你喜欢
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多