如果csv列标题包含空格,则将csv转换为spark中的拼花会产生错误

时间:2018-08-01 15:45:02

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

我有一个csv文件,正在使用scala中的databricks库将其转换为拼花文件。我正在使用以下代码:

val spark = SparkSession.builder().master("local[*]").config("spark.sql.warehouse.dir", "local").getOrCreate()
var csvdf = spark.read.format("org.apache.spark.csv").option("header", true).csv(csvfile)
csvdf.write.parquet(csvfile + "parquet")

现在,如果我的列标题中没有空格,则上面的代码可以正常工作。但是,如果任何csv文件的列标题中都有空格,则它将不起作用,并且会错误地指出无效的列标题。我的csv文件用,分隔。

此外,我无法更改csv的列名称的空格。即使列名包含最终用户指定的空格,列名也必须保持原样。

关于如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:2)

在保存之前,我将重命名数据框中的有问题的列,以将空间更改为下划线。可以与select "foo bar" as "foo_bar".withColumnRenamed("foo bar", "foo_bar")

一起使用

答案 1 :(得分:2)

每个@CodeHunter的请求

遗憾的是,拼花文件格式不允许在列名中留空格;
尝试时会吐出的错误是:contains invalid character(s) among " ,;{}()\n\t="

ORC也不允许在列名中使用空格:(

大多数sql引擎不支持带空格的列名,因此最好将列转换为foo_barfooBar的首选项或类似的内容