CnosDB中创建NDJSON格式外部表无数据返回问题咨询
CnosDB创建NDJSON外部表查询无数据的解决方法
问题概述
在CnosDB 2.3.4(修订版本6765f19dcc86f9df02c225c139912d50769457ac)中创建NDJSON格式外部表后,执行查询无数据返回,复现步骤如下:
- 创建NDJSON数据文件
echo -e '{"name": "John", "age": 30, "city": "New York"}\n{"name": "Alice", "age": 25, "city": "Los Angeles"}\n{"name": "Bob", "age": 35, "city": "Chicago"}' > basic.ndjson
- 创建外部表
CREATE EXTERNAL TABLE basic ( name STRING NOT NULL, age INT NOT NULL, city STRING NOT NULL, ) STORED AS NDJSON WITH HEADER ROW LOCATION '/basic.ndjson';
- 查询表数据无结果返回,预期应返回3条用户数据。
问题原因及修复方案
1. 表定义语法错误
表字段列表最后一行的末尾多了一个逗号,这会导致表结构解析异常,需删除多余逗号。
2. 错误使用WITH HEADER ROW选项
NDJSON格式每条数据都是独立的JSON对象,不存在单独的表头行,该选项仅适用于CSV等带表头的格式。添加此选项会让CnosDB错误地将第一条JSON数据识别为表头,导致数据无法正常解析,需移除该选项。
3. 文件路径问题
LOCATION指定的路径需是CnosDB服务进程可访问的绝对路径,使用/basic.ndjson仅当文件确实在系统根目录下才有效,建议使用明确的绝对路径(如/tmp/basic.ndjson)。
修复后的完整操作步骤
- 创建NDJSON文件(指定明确路径)
echo -e '{"name": "John", "age": 30, "city": "New York"}\n{"name": "Alice", "age": 25, "city": "Los Angeles"}\n{"name": "Bob", "age": 35, "city": "Chicago"}' > /tmp/basic.ndjson
- 正确创建外部表
CREATE EXTERNAL TABLE basic ( name STRING NOT NULL, age INT NOT NULL, city STRING NOT NULL ) STORED AS NDJSON LOCATION '/tmp/basic.ndjson';
- 执行查询
SELECT * FROM basic;
此时会返回预期结果:
+-------+-----+-------------+ | name | age | city | +-------+-----+-------------+ | John | 30 | New York | | Alice | 25 | Los Angeles | | Bob | 35 | Chicago | +-------+-----+-------------+
额外检查点
- 确保CnosDB服务进程对目标文件有读取权限,可通过
chmod 644 /tmp/basic.ndjson设置权限 - 若为容器部署的CnosDB,需将本地文件挂载到容器内部,
LOCATION使用容器内的对应路径
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

