Presto创建Hive TextFile外部表查询返回NULL问题求助
问题分析与解决方案
你遇到的核心问题是表格式配置和实际文件的字段分隔符不匹配,导致Presto无法正确解析你的CSV/TSV文件,具体原因和解决方法如下:
为什么会返回NULL?
当你创建表时指定format='TEXTFILE',Presto对接Hive时会默认使用Hive TEXTFILE的默认分隔符——ASCII字符\001(也就是键盘上的Ctrl+A)来拆分字段。但你的文件用的是逗号或制表符,两者不匹配,Presto自然无法识别字段边界,所以所有字段都返回NULL。
而当文件只有一列值时,不需要拆分字段,所以Presto能直接读取这一列的数据,这也反过来验证了是分隔符不匹配的问题。
两种可行的解决方法
方法一:直接使用CSV格式解析(推荐)
如果你的文件是标准逗号分隔的CSV,或者制表符分隔的TSV,直接把表格式指定为CSV,并按需明确分隔符:
-- 逗号分隔的CSV文件 CREATE TABLE hive.testschema.au1 ( count bigint, matched bigint ) WITH ( format = 'CSV', external_location = 'hdfs://192.168.0.115:9000/user/bzhang/filefortable', skip_header_line_count = 0 -- 没有表头就设0,有表头设1 ); -- 如果是制表符分隔的TSV文件,添加csv_delimiter参数 CREATE TABLE hive.testschema.au1 ( count bigint, matched bigint ) WITH ( format = 'CSV', external_location = 'hdfs://192.168.0.115:9000/user/bzhang/filefortable', csv_delimiter = '\t', skip_header_line_count = 0 );
方法二:继续使用TEXTFILE,指定正确分隔符
如果你坚持要用TEXTFILE格式,需要显式告诉Presto你的文件用的是什么分隔符:
-- 逗号分隔的情况 CREATE TABLE hive.testschema.au1 ( count bigint, matched bigint ) WITH ( format = 'TEXTFILE', external_location = 'hdfs://192.168.0.115:9000/user/bzhang/filefortable', textfile_field_separator = ',' ); -- 制表符分隔的情况 CREATE TABLE hive.testschema.au1 ( count bigint, matched bigint ) WITH ( format = 'TEXTFILE', external_location = 'hdfs://192.168.0.115:9000/user/bzhang/filefortable', textfile_field_separator = '\t' );
验证修改
修改表结构后,重新执行SELECT * FROM au1;,就能正确读取到123 | 1的结果了。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

