在Django中用Spark读取JSON遇java.net.URISyntaxException错误求助
Spark读取JSON字符串报错URISyntaxException的原因与解决办法
问题原因
- Spark的
spark.read.json()方法是用来读取文件系统中的JSON文件的,参数必须是合法的文件路径(本地路径、HDFS路径等),不能直接传入JSON字符串内容。 - 你把完整的JSON结构字符串当作参数传入时,Spark会将其视为文件URI解析,JSON里的特殊字符(如
[、{、空格)会被URL编码,最终触发java.net.URISyntaxException错误。 - CSV读取正常是因为你传入的
csvFile是合法文件路径,和JSON场景的参数类型不匹配问题无关,也和你看到的Livy/Griffin bug没有关联。
解决方案
根据使用场景选择对应方法:
场景1:测试用小数据,直接用JSON字符串生成DataFrame
把JSON字符串解析为Python对象,再通过spark.createDataFrame()创建DataFrame:
import json schema2 = ... # 你的预定义Schema json_str = ''' [ {"name": "John Doe", "age": 30, "city": "New York"}, {"name": "Jane Smith", "age": 25, "city": "London"}, {"name": "Bob Johnson", "age": 35, "city": "Paris"} ] ''' # 解析JSON为Python列表 data_list = json.loads(json_str) # 创建带Schema的DataFrame jsonDF = spark.createDataFrame(data_list, schema=schema2)
场景2:业务场景,JSON数据存储在文件中
将JSON内容保存到文件系统,传入文件路径给spark.read.json():
# 示例:本地文件路径或HDFS路径 jsonDF = spark.read.schema(schema2).json("./data/users.json")
场景3:通过文本方式解析JSON字符串
先把JSON字符串转为文本DataFrame,再用from_json函数解析:
from pyspark.sql.functions import from_json schema2 = ... # 你的预定义Schema json_file = ''' [ {"name": "John Doe", "age": 30, "city": "New York"}, {"name": "Jane Smith", "age": 25, "city": "London"}, {"name": "Bob Johnson", "age": 35, "city": "Paris"} ] ''' # 创建单行文本DataFrame text_df = spark.createDataFrame([(json_file.strip(),)], ["raw_json"]) # 解析JSON并展开字段 jsonDF = text_df.select(from_json("raw_json", schema2).alias("user_data")).select("user_data.*")
内容的提问来源于stack exchange,提问作者Lukas Trenz
相关产品推荐
相关产品推荐

