我什至不确定我是否正确地提出了这个问题,但我会尝试 - 我有一堆从 Linux 系统上的 Oracle 导出生成的巨大文本文件。每个文件大小约为 30 GB,我有大约 50 个。
目标是将此数据导出到 Azure SQL 数据仓库。在这种情况下,考虑到数据的大小,BCP 不是正确的方法,所以我不得不使用 Polybase。
从 ASCII 转换为 UTF8 编码后,我在查询外部表时遇到了问题。Polybase 不能很好地处理固定宽度的文本文件,每行都有换行符。
文本文件如下所示:
101,102,103,104,105,106,107 108,108,109,110,111,112,113 114,115,116,117,118,119,120 121,122,123 --这里什么都没有,只有一个空行 201,202,203,204,205,206,207 208,209,210,211,212,213,214 215,216,217
Polybase 尝试处理从 101 到 107 的错误,并抱怨此文件中没有足够的列来处理。
这是我认为正在发生的事情:固定宽度和换行符使其将换行符视为行分隔符。
如何将此文件转换为如下所示:
101,102,103,104,105,106,107,108,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123{CR}{LF} 201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217{CR}{LF}
编辑:这是来自文件的示例数据。我在 Windows VM 上的 git bash 中打开它。
这些文件应该有 167 列,
作为列分隔符。问题是,由于每一行产生多行,因此很难从 Polybase 外部表中处理它们。
Polybase 功能强大,但并不那么复杂,因此无法处理这种奇怪的格式。在我看来,您有三个选择:
请尝试回答我上面的问题并提供示例文件,我会尽力提供帮助。
根据十六进制编辑器,您的示例文件具有用于某些行结尾的单换行符 (0A) 和两个换行符作为行之间的分隔符:
U-SQL 自定义提取器可能能够处理此文件,但我想知道我们是否会遇到完整的 30GB 文件的问题。
指示
添加 U-SQL 脚本并将以下文本添加到 U-SQL 代码隐藏文件中:
使用自定义提取器处理文件:
这产生了一个清理文件,我可以使用 Polybase 导入它:
祝你好运!
我最终使用 sed 来清理文件
zcat myfile.txt.gz | sed -r 's/[ ]+/vin/g'|tr -d '\n'|tr 'vinvin' '\n'|grep -v '^$' > myfile.txt
这解决了源文件的格式问题。将这些文件上传到 Azure blob 存储后,剩下的就很简单了。我通过 Polybase 创建了指向 blob 上文件的外部表,然后使用
CREATE TABLE dbo.internal AS SELECT * FROM blob.external
. 具有 700 DWH 容量的 Azure DWH 实例能够在 5 分钟内从外部表加载大约 5000 万行。