首页 文章

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

提问于
浏览
3

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中对我的Data Lake Analytics服务执行此操作,我得到以下内容 .

E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_TOO_LONG尝试转换列数据时值太长失败 . 无法将字符串转换为正确的类型 . 结果数据长度太长 .

请参阅下面的屏幕截图

enter image description here

用其他工具检查过后,我可以确认源文件中最长行的长度为 189,943 characters .

Questions

所以我向你们提问我的朋友......

  • 还有其他人达到此限制吗?

  • 定义的char行限制是多少?

  • 解决这个问题的最佳方法是什么?

  • 是否需要定制提取器?

Other Things

其他一些想法......

  • 由于文件中的每个新行都是一个自包含的JSON数据块,我无法拆分该行 .

  • 如果手动将单个长行复制到单独的文件中并格式化JSON USQL,则可以使用Newtonsoft.Json库按预期处理它 .

  • 目前我正在使用VS2015和Data Lake Tools 2.2.7版 .

提前感谢您对此的支持 .

1 回答

  • 4

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

    根据我的经验,很多人都遇到了它(特别是在处理JSON时) . 有几种方法可以解决它:

    • 找到一种方法来重写提取器以返回byte []并避免生成字符串值,直到您真的必须这样做 . 这应该会给你更多的数据(最多4MB) .

    • 编写一个自定义提取程序,将您特定JSON格式的所有导航和分解下载到叶节点,从而避免中间长字符串值 .

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

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

相关问题