Spark读取JSON生成DataFrame时自动新增额外列问题咨询
读取JSON时自动多出
year列?这是Spark的分区自动发现特性在搞鬼! 嘿,这个问题其实是Spark内置的**分区自动发现(Partition Discovery)**功能导致的,我来给你拆解清楚:
核心原因:你的目录命名触发了Spark的分区识别
你写入数据的目录是/home/neelesh/year=2018/,这种[列名]=[值]的目录命名是Spark官方约定的分区目录格式。当你读取这个目录下的文件时,Spark会自动扫描上层目录结构,解析出year=2018这个键值对,然后把year作为新列名,2018作为所有行的对应值,自动加到你的DataFrame里。
对应你的读写流程来看:
- 写入阶段:你只是把DataFrame写入到
year=2018目录,但这个目录名刚好符合Spark的分区命名规范——哪怕你没显式用partitionBy方法来指定分区列,Spark读取时依然会识别它 - 读取阶段:哪怕你用了
/home/neelesh/year=2018/*指定读取目录下的所有文件,Spark依然会向上遍历目录结构,识别到分区信息并自动添加对应列
如果你不想自动添加这个列,有两种实用解决办法:
- 关闭分区列类型推断:在读取前设置配置项,直接禁用自动识别分区的功能
sqlContext.setConf("spark.sql.sources.partitionColumnTypeInference.enabled", "false") val newDF = sqlContext.read.json("/home/neelesh/year=2018/*")
- 精确指定文件路径:直接读取具体的JSON文件(比如
/home/neelesh/year=2018/part-00000.json),而不是用通配符扫描整个目录——不过这种方式在文件数量较多时不太方便
当然,如果后续你需要用分区来优化查询性能,这个特性其实是很实用的——它能帮你自动获取分区维度,不用手动去处理分区值~
内容的提问来源于stack exchange,提问作者Neelesh Sambhajiche
相关产品推荐
相关产品推荐

