如果 csv 列标题包含空格,则在 spark 中将 csv 转换为 parquet 会出错

Posted

技术标签:

【中文标题】如果 csv 列标题包含空格,则在 spark 中将 csv 转换为 parquet 会出错【英文标题】:Converting csv to parquet in spark gives error if csv column headers contain spaces 【发布时间】:2018-08-01 15:45:01 【问题描述】:

我有 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 列名的空格。列名必须保持原样,即使它们包含最终用户给出的空格。

知道如何解决这个问题吗?

【问题讨论】:

parquet 文件格式不允许在列名中使用空格; contains invalid character(s) among " ,;()\n\t=". ORC 也不允许在列名中使用空格 @JamesTobin 您能否将此作为解决方案提供给 OP?我认为你的评论清除了它。谢谢。 【参考方案1】:

根据@CodeHunter 的要求

遗憾的是,parquet 文件格式不允许在列名中使用空格; 当您尝试时它会吐出的错误是:contains invalid character(s) among " ,;()\n\t="

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

大多数 sql 引擎不支持带空格的列名,因此您最好将列转换为您喜欢的 foo_barfooBar 或类似的东西

【讨论】:

【参考方案2】:

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

【讨论】:

你的意思是在写 parquet 之前,对吧?我认为这是一种解决方案,但我在想是否有什么东西可以直接处理这种情况。 是的,我的意思是在写到镶木地板之前。可能还有一些在 csv 读取中引用/转义的选项会起作用,但我 a) 对它们不太自信,并且 b) 倾向于在我自己的代码中更喜欢没有空格的名称,所以我在预测!

以上是关于如果 csv 列标题包含空格,则在 spark 中将 csv 转换为 parquet 会出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spark 验证 CSV 文件列

数据框行和列是不是包含字符串?如果是这样,则在新列中返回该字符串

Julia Box 绘图,不读取名称包含空格和括号的 csv 文件列但读取 1word 列标题没有问题的列

Sparklyr:如何将列表列分解为Spark表中自己的列?

Python 中 Spark RDD 的列操作

Spark:你能在输出文件中包含分区列吗?