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尝试转换列数据时值太长失败 . 无法将字符串转换为正确的类型 . 结果数据长度太长 .
请参阅下面的屏幕截图
用其他工具检查过后,我可以确认源文件中最长行的长度为 189,943 characters .
Questions
所以我向你们提问我的朋友......
-
还有其他人达到此限制吗?
-
定义的char行限制是多少?
-
解决这个问题的最佳方法是什么?
-
是否需要定制提取器?
Other Things
其他一些想法......
-
由于文件中的每个新行都是一个自包含的JSON数据块,我无法拆分该行 .
-
如果手动将单个长行复制到单独的文件中并格式化JSON USQL,则可以使用Newtonsoft.Json库按预期处理它 .
-
目前我正在使用VS2015和Data Lake Tools 2.2.7版 .
提前感谢您对此的支持 .
1 回答
列中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上提交/投票请求将会有所帮助 .