如何使用从拼花文件中读取的Spark数据帧的空格来删除/替换列名?

时间:2018-06-20 10:32:24

标签: scala apache-spark apache-spark-sql parquet

我正在处理的数据集的列中有空格,当我尝试重命名spark数据框列名时,我感到震惊。尝试了stackoverflow中几乎所有可用的解决方案。似乎没有任何作用。

注意:文件必须是实木复合地板文件

df.printSchema

root
 |-- Type: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- ID: string (nullable = true)
 |-- Catg Name: string (nullable = true)
 |-- Error Msg: string (nullable = true)

df.show()
错误:

  

警告:有一项弃用警告;使用-deprecation重新运行以获取详细信息
  org.apache.spark.sql.AnalysisException:属性名称“类别名称”在“,; {}()\ n \ t =“中包含无效字符。请使用别名重命名。

尝试过:

df.select(df.col("Catg Name").alias("Catg_Name"))    

,然后 df.printSchema

root
 |-- Type: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- ID: string (nullable = true)
 |-- Catg_Name: string (nullable = true)
 |-- Error_Msg: string (nullable = true)

效果很好,但是当我使用 df.show()时,它会抛出相同的错误。

  

警告:有一项弃用警告;使用-deprecation重新运行以获取详细信息
  org.apache.spark.sql.AnalysisException:属性名称“类别名称”在“,; {}()\ n \ t =“中包含无效字符。请使用别名重命名。

1 个答案:

答案 0 :(得分:2)

通过删除列名中的空格并重新分配给Dataframe来解决这个问题吗?

val df1 = df.toDF("col 1","col 2","col 3") // Dataframe with spaces in column names

val new_cols =  df1.columns.map(x => x.replaceAll(" ", "")) // new column names array with spaces removed

val df2 = df1.toDF(new_cols : _*) // df2 with new column names(spaces removed)