DataBricks:在 Python 中将 CSV 数据提取到 Delta Live 表会触发“表名称中的无效字符”错误 - 如何设置列映射模式?

Asf*_*azi 8 pyspark databricks delta-live-tables

首先,我可以说我在写这篇文章时正在学习 DataBricks,所以我想要更简单、更粗糙的解决方案以及更复杂的解决方案。

我正在读取这样的 CSV 文件:

df1 = spark.read.format("csv").option("header", True).load(path_to_csv_file)
Run Code Online (Sandbox Code Playgroud)

然后我将其保存为 Delta Live Table,如下所示:

df1.write.format("delta").save("table_path")
Run Code Online (Sandbox Code Playgroud)

CSV 标题中包含空格和&等字符/,我收到错误:

AnalysisException:在架构的列名称中的“,;{}()\n\t=”中发现无效字符。请通过将表属性“delta.columnMapping.mode”设置为“name”来启用列映射。有关更多详细信息,请参阅https://docs.databricks.com/delta/delta-column-mapping.html 或者您可以使用别名对其进行重命名。

我在该问题上看到的文档解释了如何在使用 创建表后将列映射模式设置为“名称” ALTER TABLE,但没有解释如何在创建时设置它,特别是在使用上面的 DataFrame API 时。有没有办法做到这一点?

有没有更好的方法将 CSV 放入新表中?


更新:

阅读此处此处的文档,并受到罗伯特回答的启发,我首先尝试了以下操作:

spark.conf.set("spark.databricks.delta.defaults.columnMapping.mode", "name")
Run Code Online (Sandbox Code Playgroud)

仍然没有运气,我遇到了同样的错误。有趣的是,对于初学者来说,将标题中包含空格的 CSV 文件写入 Delta Live Table 是多么困难

Asf*_*azi 11

感谢 Databricks 社区论坛上的 Hemant,我找到了答案。

df1.write.format("delta").option("delta.columnMapping.mode", "name")
                         .option("path", "table_path").saveAsTable("new_table")
Run Code Online (Sandbox Code Playgroud)

现在我可以使用 SQL 查询它或将其加载到 Spark 数据帧中:

SELECT * FROM new_table;
Run Code Online (Sandbox Code Playgroud)
delta_df = spark.read.format("delta").load("table_path")
display(delta_df)
Run Code Online (Sandbox Code Playgroud)

SQL方式

此方法执行相同的操作,但使用的是 SQL。

首先,为 CSV 文件创建一个 CSV 支持的表:

CREATE TABLE table_csv
  USING CSV
  OPTIONS (path '/path/to/file.csv', 'header' 'true', 'mode' 'FAILFAST');
Run Code Online (Sandbox Code Playgroud)

然后使用 CSV 支持的表创建一个 Delta 表:

CREATE TABLE delta_table
  USING DELTA
  TBLPROPERTIES ("delta.columnMapping.mode" = "name")
  AS SELECT * FROM table_csv;

SELECT * FROM delta_table;
Run Code Online (Sandbox Code Playgroud)

我已经验证,如果我省略 TBLPROPERTIES 语句,我会得到与使用 Python 时相同的错误。

我想 Python 的答案是使用spark.sqlPython 来使用和运行它,这样我就可以将 CSV 路径变量嵌入到 SQL 中。