You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark Shell SQL新建表加载数据后查询全为null的原因排查

Spark Shell加载本地文件后查询结果全为null的原因及解决方法

问题场景

作为Spark Shell新手,尝试新建表并读取本地workers.txt数据,文件内容如下:

1201, satish, 25
1202, krishna, 28
1203, amith, 39
1204, javed, 23
1205, prudvi, 23

执行以下命令后,查询结果所有字段均为null:

spark-shell
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("CREATE TABLE workers (id INT, name VARCHAR(64), age INT)")
sqlContext.sql("LOAD DATA LOCAL INPATH 'workers.txt' INTO TABLE workers")
// res5: org.apache.spark.sql.DataFrame = []
val resultW = sqlContext.sql("FROM workers SELECT *")
// resultW: org.apache.spark.sql.DataFrame = [id: int, name: string ... 1 more field]
resultW.show()
// 输出结果:
// +----+----+----+                                                                 
// |  id|name| age|
// +----+----+----+
// |null|null|null|
// |null|null|null|
// |null|null|null|
// |null|null|null|
// |null|null|null|
// +----+----+----+

确认workers.txt与当前工作目录一致,请问问题原因是什么?

原因分析

Spark的HiveContext默认使用**制表符(\t)作为字段分隔符,但你的workers.txt使用的是逗号加空格(", ")**作为字段分隔符,Spark无法匹配分隔规则解析数据,因此所有字段值都被识别为null。

解决方法

方法1:创建表时指定对应分隔符

在创建表的SQL语句中,明确指定文件的字段分隔符:

CREATE TABLE workers (id INT, name VARCHAR(64), age INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ', '

执行上述建表语句后,再重新执行LOAD DATA命令,即可正确解析数据。

方法2:修改文件分隔符并适配表定义

如果不想修改表结构,可以将workers.txt中的", "替换为制表符(\t),或者纯逗号(",");若替换为纯逗号,建表时需指定分隔符为',':

CREATE TABLE workers (id INT, name VARCHAR(64), age INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','

方法3:使用DataFrame API直接读取文件(更灵活)

跳过Hive表创建步骤,直接用DataFrame API读取文件并注册为临时视图:

val df = spark.read.option("sep", ", ").csv("workers.txt")
df.toDF("id", "name", "age").createOrReplaceTempView("workers")
df.show()

这种方式无需依赖HiveContext,且能快速适配自定义分隔符。

内容的提问来源于stack exchange,提问作者Atheel Massalha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:20:43