pyspark DataBricks:在Python中将CSV数据接收到Delta Live Table会触发“表名中的无效字符”错误-如何设置列Map模式?

ktca8awb  于 2023-03-17  发布在  Spark
关注(0)|答案(3)|浏览(138)

首先,我可以说我在写这篇文章的时候正在学习DataBricks,所以我喜欢更简单、更粗糙的解决方案以及更复杂的解决方案。
我正在阅读一个CSV文件,如下所示:

df1 = spark.read.format("csv").option("header", True).load(path_to_csv_file)

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

df1.write.format("delta").save("table_path")

CSV头中包含空格、&/等字符,我收到错误消息:
分析异常:在“,”中发现无效字符;{}()\n\t=”。请通过将表属性“delta.columnMapping.mode”设置为“name”来启用列Map。有关详细信息,请参阅https://docs.databricks.com/delta/delta-column-mapping.html,或者可以使用alias对其进行重命名。
documentation I've seen on the issue解释了如何在使用ALTER TABLE创建表之后将列Map模式设置为'name',但没有解释如何在创建时设置它,特别是在使用上面的DataFrame API时。有办法做到这一点吗?
有没有更好的方法将CSV放入新表?
更新:
阅读了这里的文档和here,并受到Robert答案的启发,我首先尝试了以下方法:

spark.conf.set("spark.databricks.delta.defaults.columnMapping.mode", "name")

还是没有运气,我得到了同样的错误。有趣的是,对于一个初学者来说,编写一个头中有空格的CSV文件到DeltaLiveTable是多么的困难

rqenqsqc

rqenqsqc1#

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

df1.write.format("delta").option("delta.columnMapping.mode", "name")
                         .option("path", "table_path").saveAsTable("new_table")

现在我可以用SQL查询它,也可以将它加载到Spark Dataframe 中:
x一个一个一个一个x一个一个二个x

SQL方式

这个方法做同样的事情,但是在SQL中。
首先,为CSV文件创建CSV支持的表:

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

然后使用CSV支持的表创建增量表:

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

SELECT * FROM delta_table;

我已经验证了,如果省略TBLPROPERTIES语句,我会得到与使用Python时相同的错误。
我猜Python的答案是使用spark.sql并使用Python运行它,这样我就可以在SQL中嵌入CSV路径变量。

tpgth1q7

tpgth1q72#

你可以在你正在使用的集群的Spark配置中设置这个选项,这就是你在运行时启用该模式的方法。
您还可以在运行时设置配置,如下所示:

spark.conf.set("spark.databricks.<name-of-property>", <value>)
yr9zkbsy

yr9zkbsy3#

以下几点对我很有效

spark.conf.set("spark.databricks.delta.properties.defaults.columnMapping.mode","name")

在您的原始帖子中,缺少“. properties.”

相关问题