尝试转换列数据时值太长失败
Value too long failure when attempting to convert column data
场景
我有一个源文件,每个新行都包含 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 中的数据湖分析服务执行此操作,我得到以下结果。
E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_TOO_LONG
Value too long failure when attempting to convert column data.
Can not convert string to proper type. The resulting data length is
too long.
请参阅下面的屏幕截图。
用其他工具检查后,我可以确认源文件中最长行的长度是 189,943 个字符。
问题
所以我想问你们朋友们...
- 还有其他人达到这个限制吗?
- 定义的字符行限制是多少?
- 解决这个问题的最佳方法是什么?
- 是否需要自定义提取器?
其他
其他一些想法...
- 由于文件中的每一行都是一个独立的 JSON 数据块,所以我无法拆分该行。
- 如果手动将单个长行复制到单独的文件中并格式化 JSON USQL 将按预期使用 Newtonsoft.Json 库处理它。
- 目前我正在使用 VS2015 和数据湖工具版本 2.2.7。
提前感谢您对此的支持。
列中 U-SQL 字符串值的限制当前为 128kB(请参阅 https://msdn.microsoft.com/en-us/library/azure/mt764129.aspx)。
根据我的经验,很多人都 运行 喜欢它(尤其是在处理 JSON 时)。有几种解决方法:
找到一种方法将提取器重写为 return byte[] 并避免生成字符串值,直到你真的不得不这样做。这应该会给你更多的数据(最多 4MB)。
编写一个自定义提取器,对您的特定 JSON 格式进行所有导航和分解直至叶节点,从而避免中间长字符串值。
Return SqlArray 而不是字符串数据类型值并将字符串分块为 128kB(采用 UTF-8 编码,而不是 C# 的默认 UTF-16 编码!)。
我们正在考虑增加字符串大小,但如果您可以 file/vote 在 http://aka.ms/adlfeedback 上提出请求,那将会很有帮助。
场景
我有一个源文件,每个新行都包含 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 中的数据湖分析服务执行此操作,我得到以下结果。
E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_TOO_LONG
Value too long failure when attempting to convert column data.
Can not convert string to proper type. The resulting data length is too long.
请参阅下面的屏幕截图。
用其他工具检查后,我可以确认源文件中最长行的长度是 189,943 个字符。
问题
所以我想问你们朋友们...
- 还有其他人达到这个限制吗?
- 定义的字符行限制是多少?
- 解决这个问题的最佳方法是什么?
- 是否需要自定义提取器?
其他
其他一些想法...
- 由于文件中的每一行都是一个独立的 JSON 数据块,所以我无法拆分该行。
- 如果手动将单个长行复制到单独的文件中并格式化 JSON USQL 将按预期使用 Newtonsoft.Json 库处理它。
- 目前我正在使用 VS2015 和数据湖工具版本 2.2.7。
提前感谢您对此的支持。
列中 U-SQL 字符串值的限制当前为 128kB(请参阅 https://msdn.microsoft.com/en-us/library/azure/mt764129.aspx)。
根据我的经验,很多人都 运行 喜欢它(尤其是在处理 JSON 时)。有几种解决方法:
找到一种方法将提取器重写为 return byte[] 并避免生成字符串值,直到你真的不得不这样做。这应该会给你更多的数据(最多 4MB)。
编写一个自定义提取器,对您的特定 JSON 格式进行所有导航和分解直至叶节点,从而避免中间长字符串值。
Return SqlArray 而不是字符串数据类型值并将字符串分块为 128kB(采用 UTF-8 编码,而不是 C# 的默认 UTF-16 编码!)。
我们正在考虑增加字符串大小,但如果您可以 file/vote 在 http://aka.ms/adlfeedback 上提出请求,那将会很有帮助。