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
相关产品推荐
相关产品推荐

