Azure Databricks 到 Azure SQL DW:长文本列

     2023-02-15     134

关键词:

【中文标题】Azure Databricks 到 Azure SQL DW:长文本列【英文标题】:Azure Databricks to Azure SQL DW: Long text columns 【发布时间】:2020-06-16 16:52:23 【问题描述】:

我想从 Azure Databricks 笔记本环境填充 Azure SQL DW。我正在使用带有 pyspark 的内置连接器:

sdf.write \
  .format("com.databricks.spark.sqldw") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "test_table") \
  .option("url", url) \
  .option("tempDir", temp_dir) \
  .save()

这很好用,但是当我包含一个内容足够长的字符串列时会出错。我收到以下错误:

Py4JJavaError:调用 o1252.save 时出错。 : com.databricks.spark.sqldw.SqlDWSideException: SQL DW 无法执行连接器生成的 JDBC 查询。

基础 SQLException(s): - com.microsoft.sqlserver.jdbc.SQLServerException:HdfsBridge::recordReaderFillBuffer - 填充记录读取器缓冲区时遇到意外错误:HadoopSqlException:字符串或二进制数据将被截断。 [错误代码 = 107090] [SQLState = S0001]

据我了解,这是因为默认字符串类型是 NVARCHAR(256)。可以配置 (reference),但最大 NVARCHAR 长度为 4k 个字符。我的字符串偶尔会达到 10k 个字符。 因此,我很好奇如何将某些列导出为文本/长文本。

如果在创建表后只执行preActions,我猜以下方法会起作用。它不是,因此它失败了。

sdf.write \
  .format("com.databricks.spark.sqldw") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "test_table") \
  .option("url", url) \
  .option("tempDir", temp_dir) \
  .option("preActions", "ALTER TABLE test_table ALTER COLUMN value NVARCHAR(MAX);") \
  .save()

另外,postActions 是在插入数据后执行的,因此也会失败。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,并且能够使用以下选项解决它:

.option("maxStrLength",4000)

因此,在您的示例中,这将是:

sdf.write \
  .format("com.databricks.spark.sqldw") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "test_table") \
  .option("maxStrLength",4000)\
  .option("url", url) \
  .option("tempDir", temp_dir) \
  .save()

这是documented here:

"Spark 中的 StringType 映射到 Azure Synapse 中的 NVARCHAR(maxStrLength) 类型。您可以使用 maxStrLength 为 Azure 中名为 dbTable 的表中的所有 NVARCHAR(maxStrLength) 类型列设置字符串长度突触。”

如果您的字符串超过 4k,那么您应该:

使用 NVARCHAR(MAX) 预定义表列,然后以追加模式写入表。在这种情况下,您不能使用默认的列存储索引,因此请使用 HEAP 或设置正确的索引。惰性堆是:

CREATE TABLE example.table
(
    NormalColumn NVARCHAR(256),
    LongColumn NVARCHAR(4000),
    VeryLongColumn NVARCHAR(MAX)
) 
WITH (HEAP)

然后你可以像往常一样写它,没有 maxStrLength 选项。这也意味着您不会过度指定所有其他字符串列。

其他选项是:

    使用 split 将 1 列转换为多个字符串列。 另存为镶木地板,然后从突触内部加载

【讨论】:

其实在大多数情况下VARCHAR(4000) 会比NVARCHAR(4000) 好,只是主题不同。

使用 /mnt/ 将数据从 Azure Blob 存储读取到 Azure Databricks

】使用/mnt/将数据从AzureBlob存储读取到AzureDatabricks【英文标题】:ReadingdatafromAzureBlobStorageintoAzureDatabricksusing/mnt/【发布时间】:2019-08-0623:00:03【问题描述】:我已成功将Blob存储挂载到Databricks,并且在运行dbutils.fs.ls("/mnt/")... 查看详情

作业终止后如何将生成的文件从 Azure Databricks 导出到 Azure DevOps?

】作业终止后如何将生成的文件从AzureDatabricks导出到AzureDevOps?【英文标题】:HowtoexportfilesgeneratedtoAzureDevOpsfromAzureDatabricksafterajobterminates?【发布时间】:2021-10-2103:07:23【问题描述】:我们正在使用AzureDevOps向Databricks提交训练作... 查看详情

使用 azure databricks 读取 azure databricks 日志 json 文件

】使用azuredatabricks读取azuredatabricks日志json文件【英文标题】:Readingazuredatabrickslogsjsonfileusingazuredatabricks【发布时间】:2022-01-0122:00:58【问题描述】:我已通过启用诊断设置将数据块日志发送到存储帐户,现在我必须使用azure数据... 查看详情

Databricks:将数据框合并到 Azure 突触表中

】Databricks:将数据框合并到Azure突触表中【英文标题】:Databricks:MergedataframeintoAzuresynapsetable【发布时间】:2021-03-1305:39:12【问题描述】:有什么方法可以将数据框合并到AzureSynapse表中?我为dataframe.write.mode()找到了什么只允许追... 查看详情

从 Azure Databricks 笔记本登录到 Azure ML 工作区

】从AzureDatabricks笔记本登录到AzureML工作区【英文标题】:LogintoAzureMLworkspacefromAzureDatabricksnotebook【发布时间】:2019-02-1123:51:50【问题描述】:我正在AzureDatabricks集群中编写一个python笔记本来执行Azure机器学习实验。我创建了一个A... 查看详情

SQLServer 到 Azure Databricks 的转换

】SQLServer到AzureDatabricks的转换【英文标题】:SQLServertoAzureDatabricksConversion【发布时间】:2021-10-2910:47:19【问题描述】:我正在将SQLServer迁移到Databricks。我有许多TSQL程序,最少100行代码。我想将这些过程转换为Spark代码。对于POC... 查看详情

将数据存储到 PySpark (Azure - DataBricks) 中的数据库非常慢

】将数据存储到PySpark(Azure-DataBricks)中的数据库非常慢【英文标题】:StoringdatatodatabaseinPySpark(Azure-DataBricks)isveryslow【发布时间】:2018-09-1910:34:42【问题描述】:我正在处理大约有60亿条记录的大数据集,我已经成功地执行了所有... 查看详情

使用 Databricks 将文件从 Azure 文件移动到 ADLS Gen 2 并返回

】使用Databricks将文件从Azure文件移动到ADLSGen2并返回【英文标题】:MoveFilesfromAzureFilestoADLSGen2andBackusingDatabricks【发布时间】:2021-10-1823:19:06【问题描述】:我有一个Databricks进程,它当前生成一堆文本文件,这些文件存储在Azure文... 查看详情

Kafka 流加载到数据框显示数据 azure databricks

】Kafka流加载到数据框显示数据azuredatabricks【英文标题】:Kafkastreamloadtodataframedisplaydataazuredatabricks【发布时间】:2020-10-2721:52:04【问题描述】:我们有本地kafka流数据到Azure数据块设置;我们使用以下查询连接到本地主机df=spark\\.... 查看详情

从 Azure Databricks 将数据写入 Azure Blob 存储

】从AzureDatabricks将数据写入AzureBlob存储【英文标题】:WritingDatatoAzureBlobStoragefromAzureDatabricks【发布时间】:2020-11-1519:37:53【问题描述】:我能够将AzureBlob容器挂载到我的DatabricksDBFS并且还能够读取数据。在编写时,我能够从databri... 查看详情

将数据表从 Databricks dbfs 导出到 azure sql 数据库

】将数据表从Databricksdbfs导出到azuresql数据库【英文标题】:ExportdatatablefromDatabricksdbfstoazuresqldatabase【发布时间】:2021-11-2305:04:11【问题描述】:我对databricks很陌生,正在寻找一种将数据表从databricks黄金方案导出到azuresql数据库... 查看详情

将数据从 Databricks 加载到 Azure SQL 时的性能问题

】将数据从Databricks加载到AzureSQL时的性能问题【英文标题】:PerformanceissuesinloadingdatafromDatabrickstoAzureSQL【发布时间】:2021-02-2422:44:29【问题描述】:我正在尝试使用Microsoft最近发布的支持PythonAPI和Spark3.0的connector将100万条记录从D... 查看详情

为啥 Azure Databricks 需要将数据存储在 Azure 的临时存储中

】为啥AzureDatabricks需要将数据存储在Azure的临时存储中【英文标题】:WhyAzureDatabricksneedstostoredatainatempstorageinAzure为什么AzureDatabricks需要将数据存储在Azure的临时存储中【发布时间】:2020-11-2206:33:34【问题描述】:我正在关注有关... 查看详情

如何强制 Azure 数据工厂数据流使用 Databricks

】如何强制Azure数据工厂数据流使用Databricks【英文标题】:HowtoforceAzureDataFactoryDataFlowstouseDatabricks【发布时间】:2019-09-2819:36:06【问题描述】:我正在使用Azure数据工厂及其新的数据流功能。这是一个应该使用Databricks进行数据转... 查看详情

将 DataBricks 连接到 Azure Blob 存储

】将DataBricks连接到AzureBlob存储【英文标题】:ConnectingDataBrickstoAzureBlobStorage【发布时间】:2021-07-1112:12:14【问题描述】:我正在尝试将AzureBlob存储容器装载到DataBricks实例,虽然装载确实有效,但它似乎没有使用存储容器。这是... 查看详情

无法从 azure databricks 在 azure data Lake 中保存文件

】无法从azuredatabricks在azuredataLake中保存文件【英文标题】:Failedtosaveafileinazuredatalakefromazuredatabricks【发布时间】:2020-03-0515:44:00【问题描述】:我正在尝试将字符串内容作为XML内容保存到Azure数据湖中。一个字符串变量包含下面... 查看详情

如何在 Python 中从 Azure Databricks 插入 Azure SQL 数据库

】如何在Python中从AzureDatabricks插入AzureSQL数据库【英文标题】:HowtoINSERTINTOAzureSQLdatabasefromAzureDatabricksinPython【发布时间】:2019-04-0109:19:34【问题描述】:由于pyodbc无法安装到Azuredatabricks,我正在尝试使用jdbc通过Python将数据插入Az... 查看详情

Azure Databricks 的 Azure DevOps 管道

】AzureDatabricks的AzureDevOps管道【英文标题】:AzureDevOpspipelinesforAzureDatabricks【发布时间】:2019-11-2318:23:37【问题描述】:不知道Azure数据块中的所有内容都可以基于AzureDevOps管道。我们计划使用github作为存储库。就像Azure数据块可... 查看详情