场景

我有一个源文件,其中每行上都包含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

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

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

请参阅下面的屏幕截图。

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

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

问题

所以我对你的问题我的朋友们...
  • 还有其他人达到此限制吗?
  • 定义的字符行限制是什么?
  • 解决此问题的最佳方法是什么?
  • 是否需要自定义提取器?

  • 其他事物

    还有其他一些想法...
  • 由于文件中的每一行都是一个自包含的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)。

    根据我的经验,很多人都在使用它(尤其是在处理JSON时)。有几种解决方法:

  • 找到一种重写提取器以返回byte []的方法,并避免生成字符串值,除非您确实需要这样做。那应该为您提供更多数据(最大4MB)。
  • 编写一个自定义提取器,对特定JSON格式进行所有导航和分解,直至叶节点,从而避免中间的长字符串值。
  • 返回SqlArray而不是字符串数据类型值,并将字符串分块为128kB(采用UTF-8编码,而不是C#的默认UTF-16编码!)。

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

    09-27 10:37
    查看更多