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。
首先,为 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 中。
| 归档时间: |
|
| 查看次数: |
8082 次 |
| 最近记录: |