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

时间:2017-06-19 12:47:41

标签: json azure azure-data-lake u-sql

方案

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

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

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

这对我的大多数数据执行都没有失败,我可以在我的脚本中进一步解析[RawString]作为JSON而没有任何问题。

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

错误

在Visual Studio中本地执行此操作,并在Azure中对我的Data Lake Analytics服务执行此操作,我得到以下内容。

  

E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_TOO_LONG

     

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

     

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

请参阅下面的屏幕截图。

enter image description here

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

问题

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

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

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

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

    提前感谢您的支持。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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