如何让 Apache Drill 解析包含无效 UTF8 字符的 JSON 文件
How to make Apache Drill parse a JSON file with invalid UTF8 characters
我正在尝试使用 Apache Drill 运行 对 JSON 文件进行 SELECT 查询。我收到不同文件的各种错误。所有错误都是JSON 解析错误:
Error: DATA_READ ERROR: Error parsing JSON - Invalid UTF-8 middle byte 0x3f
Error: DATA_READ ERROR: Error parsing JSON - Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in string value
Error: DATA_READ ERROR: Error parsing JSON - Illegal character ((CTRL-CHAR, code 0)): only regular white space (\r, \n, \t)
第一个错误是由于某些字符的存在,例如'趨勢ç§'技å':我已经在下面尝试过:
- 在包含无效 UTF-8 字符的字段上使用
Convert_To
和 Convert_From
(无效。不要认为这些函数是用于此目的的。)
- 将
-Dsaffron.default.charset=UTF-16LE
添加到 conf/drill-env.sh
中的 DRILL_JAVA_OPTS (没有用,因为事实证明如果您的查询而不是数据包含无效的 UTF,将使用此选项-8 个字符)
- 使用 Notepad++ 将文件编码更改为 UTF-8(没有用。虽然我希望它能用)
- 尝试使用 Notepad++ 将文件编码更改为无 BOM 的 UTF-8(Notepad++ 无法转换它。保存后,再次打开时是 ANSI)
使用以下任一方法将编码更改为 'UTF-8 with BOM':
- 记事本++
- iConv(shell 实用程序)
并且,您将能够使用 Apache Drill 查询它。
我用iConv把文件编码改成了'UTF-8',用Notepad++打开转换后的文件,Notepad++显示的编码是'UTF-8 with BOM'。因此,我使用 Notepad++ 本身将原始文件的编码更改为 'UTF-8 with BOM',它也有效。
这两个文件,一个使用 iConv 转换的文件和一个使用 Notepad++ 转换的文件(基本上,任何转换为 'UTF-8 with BOM' 的文件)都可以使用 Apache Drill 进行解析。
要转换:
- 使用 Notepad++:从菜单栏 select 编码,将其更改为 'UTF8 with BOM' 并保存文件。如果此编码未显示在编码列表中,则可能有一些插件(或其他方式)使其在 Notepad++ 中可用。
- 使用 iConv :下载实用程序并使用以下命令 运行 它:iconv -f old-encoding -t new-encoding(在本例中为 UTF-8)file.txt > newfile.txt
注意:对于大文件,您可能需要在转换前将其拆分,因为在我的情况下,Notepad++ 无法打开 2GB 的文件,iConv 也无法转换它.
我正在尝试使用 Apache Drill 运行 对 JSON 文件进行 SELECT 查询。我收到不同文件的各种错误。所有错误都是JSON 解析错误:
Error: DATA_READ ERROR: Error parsing JSON - Invalid UTF-8 middle byte 0x3f
Error: DATA_READ ERROR: Error parsing JSON - Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in string value
Error: DATA_READ ERROR: Error parsing JSON - Illegal character ((CTRL-CHAR, code 0)): only regular white space (\r, \n, \t)
第一个错误是由于某些字符的存在,例如'趨勢ç§'技å':我已经在下面尝试过:
- 在包含无效 UTF-8 字符的字段上使用
Convert_To
和Convert_From
(无效。不要认为这些函数是用于此目的的。) - 将
-Dsaffron.default.charset=UTF-16LE
添加到conf/drill-env.sh
中的 DRILL_JAVA_OPTS (没有用,因为事实证明如果您的查询而不是数据包含无效的 UTF,将使用此选项-8 个字符) - 使用 Notepad++ 将文件编码更改为 UTF-8(没有用。虽然我希望它能用)
- 尝试使用 Notepad++ 将文件编码更改为无 BOM 的 UTF-8(Notepad++ 无法转换它。保存后,再次打开时是 ANSI)
使用以下任一方法将编码更改为 'UTF-8 with BOM':
- 记事本++
- iConv(shell 实用程序)
并且,您将能够使用 Apache Drill 查询它。
我用iConv把文件编码改成了'UTF-8',用Notepad++打开转换后的文件,Notepad++显示的编码是'UTF-8 with BOM'。因此,我使用 Notepad++ 本身将原始文件的编码更改为 'UTF-8 with BOM',它也有效。
这两个文件,一个使用 iConv 转换的文件和一个使用 Notepad++ 转换的文件(基本上,任何转换为 'UTF-8 with BOM' 的文件)都可以使用 Apache Drill 进行解析。
要转换:
- 使用 Notepad++:从菜单栏 select 编码,将其更改为 'UTF8 with BOM' 并保存文件。如果此编码未显示在编码列表中,则可能有一些插件(或其他方式)使其在 Notepad++ 中可用。
- 使用 iConv :下载实用程序并使用以下命令 运行 它:iconv -f old-encoding -t new-encoding(在本例中为 UTF-8)file.txt > newfile.txt
注意:对于大文件,您可能需要在转换前将其拆分,因为在我的情况下,Notepad++ 无法打开 2GB 的文件,iConv 也无法转换它.