databricks spark sql复制到不加载数据
Posted
技术标签:
【中文标题】databricks spark sql复制到不加载数据【英文标题】:databricks spark sql copy into not loading data 【发布时间】:2021-10-10 22:07:53 【问题描述】:在运行时 8.4 上运行 Azure Databricks。
我有一个来自 AdventureWorks 的 csv 文件。我已将其放置在 Azure DLS Gen2 存储、blob 容器中。
我已使用 dbutils.fs.mount 安装容器,并将配置设置为使用 OAuth 和 dbx 机密范围。我可以成功挂载驱动器,并且可以从中列出 csv 文件。
我创建了一个数据库,然后创建了一个表。
create database if not exists work_db;
CREATE OR REPLACE TABLE dim_account
(
`AccountKey` STRING, `ParentAccountKey` STRING, `AccountCodeAlternateKey` STRING, `ParentAccountCodeAlternateKey` STRING, `AccountDescription` STRING, `AccountType` STRING, `Operator` STRING, `CustomMembers` STRING, `ValueType` STRING, `CustomMemberOptions` STRING, `corrupt` STRING
) ;
我已经运行了以下各种变体(尝试不同的格式选项)
use work_db;
truncate table dim_account;
copy into dim_account
from (
select AccountKey, ParentAccountKey, AccountCodeAlternateKey, ParentAccountCodeAlternateKey,
AccountDescription, AccountType, Operator, CustomMembers, ValueType, CustomMemberOptions
from 'dbfs:/mnt/csv_source'
)
FILEFORMAT = csv
FILES = ('DimAccount.csv')
FORMAT_OPTIONS('header'='true','columnNameOfCorruptRecord'='corrupt')
;
select * from dim_account;
我相信它曾经从 csv 文件中提取数据,但现在没有。我得到以下输出(没有选择):
num_affected_rows num_inserted_rows
0 0
但是,如果我执行以下操作(也尝试了多种变体):
%python
dataSchema = "AccountKey STRING, ParentAccountKey STRING, AccountCodeAlternateKey STRING, ParentAccountCodeAlternateKey STRING, AccountDescription STRING, AccountType STRING, Operator STRING, CustomMembers STRING, ValueType STRING, CustomMemberOptions STRING, corrupt STRING"
diamonds = spark.read.csv('/mnt/csv_source/DimAccount.csv', \
header=True, schema=dataSchema, enforceSchema=True, columnNameOfCorruptRecord='corrupt').cache()
diamonds.createOrReplaceTempView('dim_account_error_on_load')
我在检索数据时没有问题。
我真的不知道 COPY INTO 发生了什么(我对这一切都很陌生)。工作更喜欢使用 SQL(或者可能不比 spark.sql() 更复杂的东西),所以我试图让副本生效。 COPY INTO 还可以对我们感兴趣的给定文件结构的多个文件进行操作。我只是想让一个文件工作,更不用说多个了。
【问题讨论】:
您是否尝试过使用完整路径进行读写,例如 delta.abfss://container@storageAccount.dfs.core.windows.net/deltaTables/target
?
@AliHasan 不,我没有。如果我尝试更改“从”中的路径,则会收到提示访问问题的错误。我假设我必须修改安全性才能让 Databricks 使用该向量而不是 OAuth、秘密范围、挂载。但是,我可以证明 COPY INTO 可以看到该文件。如果我使用 header=True 并且不引用正确的列名,我会收到错误消息。如果我在目标表中将其中一列设置为 INT 而不是 STRING,则尝试将源列隐式转换为 INT 时出现错误(这将失败)。所以 COPY INTO 与双方都有联系。
【参考方案1】:
我从工作中得到了答案。问题很简单:COPY INTO 跟踪它已经处理过的文件。默认情况下,如果您尝试处理相同的文件(至少按名称),它不会加载数据。有一个选项可以强制加载此类文件。
唉……菜鸟太难了。
【讨论】:
以上是关于databricks spark sql复制到不加载数据的主要内容,如果未能解决你的问题,请参考以下文章
如果 Databricks 或 Spark SQL 中存在表,则插入