尝试转换列数据时值太长失败

2024-01-30

Scenario

我有一个源文件,其中每个新行都包含 JSON 块。

然后,我有一个简单的 U-SQL 摘录,如下所示,其中 [RawString] 表示文件中的每个新行,[FileName] 定义为 @SourceFile 路径中的变量。

@BaseExtract = 
    EXTRACT 
        [RawString] string, 
        [FileName] string
    FROM
        @SourceFile 
    USING 
        Extractors.Text(delimiter:'\b', quoting : false);

对于我的大部分数据来说,这都不会失败,并且我能够在我的脚本中将 [RawString] 解析为 JSON,没有任何问题。

但是,我最近的文件中似乎有一行超长的数据无法提取。

Errors

在 Visual Studio 本地和 Azure 中的数据湖分析服务中执行此操作,我得到以下结果。

E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_TOO_LONG

尝试转换列数据时值太长失败。

无法将字符串转换为正确的类型。结果数据长度为 太长。

请参阅下面的屏幕截图。

使用其他工具检查后,我可以确认源文件中最长行的长度是189,943 个字符.

问题

所以我要问你们的问题我的朋友们...

  1. 还有其他人达到这个限制吗?
  2. 定义的字符行限制是多少?
  3. 解决这个问题的最佳方法是什么?
  4. 是否需要定制提取器?

其他事情

还有一些其他的想法......

  • 由于文件中的每个新行都是一个自包含的 JSON 数据块,因此我无法拆分该行。
  • 如果手动将单个长行复制到单独的文件中并格式化 JSON,USQL 会按照 Newtonsoft.Json 库的预期进行处理。
  • 目前我正在使用 VS2015 和 Data Lake Tools 版本 2.2.7。

预先感谢您对此的支持。


当前,列中 U-SQL 字符串值的限制为 128kB(请参阅https://msdn.microsoft.com/en-us/library/azure/mt764129.aspx https://msdn.microsoft.com/en-us/library/azure/mt764129.aspx).

根据我的经验,很多人都遇到过这种情况(尤其是在处理 JSON 时)。有几种方法可以解决这个问题:

  1. 找到一种方法来重写提取器以返回 byte[] 并避免生成字符串值,除非确实需要。这应该会为您提供更多数据(最多 4MB)。

  2. 编写一个自定义提取器,对特定 JSON 格式进行所有导航和分解直至叶节点,从而避免中间的长字符串值。

  3. 返回 SqlArray 而不是字符串数据类型值,并将字符串分块为 128kB(采用 UTF-8 编码,而不是 C# 的默认 UTF-16 编码!)。

我们正在考虑增加字符串大小,但如果您可以提交/投票请求http://aka.ms/adlfeedback http://aka.ms/adlfeedback那会有帮助的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试转换列数据时值太长失败 的相关文章

随机推荐