如果 csv 列 headers 包含空格,则在 spark 中将 csv 转换为镶木地板会出错
Converting csv to parquet in spark gives error if csv column headers contain spaces
我有 csv 文件,我正在使用 scala 中的 databricks 库将其转换为 parquet 文件。我正在使用以下代码:
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")
现在,如果我的专栏 headers 中没有 space,上面的代码可以正常工作。但是,如果任何 csv 文件在列 headers 中有 spaces,它就不起作用,并且会错误地指出列 headers 无效。我的 csv 文件由 ,
分隔。
此外,我无法更改 csv 的 space 列名称。列名必须保持原样,即使它们包含最终用户给出的 spaces。
知道如何解决这个问题吗?
我会在保存之前重命名数据框中的违规列,将 space 更改为下划线。可以与 select "foo bar" as "foo_bar"
或 .withColumnRenamed("foo bar", "foo_bar")
根据@CodeHunter 的要求
遗憾的是,parquet 文件格式不允许在列名称中使用空格;
当你尝试时它会吐出的错误是:contains invalid character(s) among " ,;{}()\n\t="
。
ORC 也不允许列名中有空格:(
大多数 sql 引擎不支持带空格的列名,因此您最好将列转换为您喜欢的 foo_bar
或 fooBar
或其他名称沿着这些路线
我有 csv 文件,我正在使用 scala 中的 databricks 库将其转换为 parquet 文件。我正在使用以下代码:
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")
现在,如果我的专栏 headers 中没有 space,上面的代码可以正常工作。但是,如果任何 csv 文件在列 headers 中有 spaces,它就不起作用,并且会错误地指出列 headers 无效。我的 csv 文件由 ,
分隔。
此外,我无法更改 csv 的 space 列名称。列名必须保持原样,即使它们包含最终用户给出的 spaces。
知道如何解决这个问题吗?
我会在保存之前重命名数据框中的违规列,将 space 更改为下划线。可以与 select "foo bar" as "foo_bar"
或 .withColumnRenamed("foo bar", "foo_bar")
根据@CodeHunter 的要求
遗憾的是,parquet 文件格式不允许在列名称中使用空格;
当你尝试时它会吐出的错误是:contains invalid character(s) among " ,;{}()\n\t="
。
ORC 也不允许列名中有空格:(
大多数 sql 引擎不支持带空格的列名,因此您最好将列转换为您喜欢的 foo_bar
或 fooBar
或其他名称沿着这些路线