方案
我有一个源文件,每个新行都包含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
尝试转换列数据时值太长失败。
无法将字符串转换为正确的类型。结果数据长度为 太久了。
请参阅下面的屏幕截图。
使用其他工具检查后,我可以确认源文件中最长行的长度是 189,943个字符。
问题
所以我的问题是你的朋友们......
其他事情
其他一些想法......
提前感谢您的支持。
答案 0 :(得分: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上提交/投票请求有用的话。