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复制到不加载数据的主要内容,如果未能解决你的问题,请参考以下文章

spark sql如何在databricks中创建表

Databricks (Spark SQL) 表的索引

如果 Databricks 或 Spark SQL 中存在表,则插入

如何在 Spark Databricks 中注册 SQL 函数

Databricks/Spark SQL 中的反透视表

Databricks/Spark SQL - 如何在地图类型字段中获取数据