【问题标题】:databricks spark sql copy into not loading datadatabricks spark sql复制到不加载数据
【发布时间】: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 与双方都有联系。

标签: apache-spark-sql databricks


【解决方案1】:

我从工作中得到了答案。问题很简单:COPY INTO 跟踪它已经处理过的文件。默认情况下,如果您尝试处理相同的文件(至少按名称),它不会加载数据。有一个选项可以强制加载此类文件。

唉……菜鸟太难了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-29
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多