在 pyspark 中读取 json 文件
reading json file in pyspark
我是 PySpark 的新手,下面是我来自 kafka 的 JSON 文件格式。
{
"header": {
"platform":"atm",
"version":"2.0"
}
"details":[
{
"abc":"3",
"def":"4"
},
{
"abc":"5",
"def":"6"
},
{
"abc":"7",
"def":"8"
}
]
}
如何详细阅读所有 "abc"
"def"
的值并将其添加到像这样的新列表 [(1,2),(3,4),(5,6),(7,8)]
。新列表将用于创建 spark 数据框。我如何在 pyspark.I 中执行此操作尝试了以下代码。
parsed = messages.map(lambda (k,v): json.loads(v))
list = []
summed = parsed.map(lambda detail:list.append((String(['mcc']), String(['mid']), String(['dsrc']))))
output = summed.collect()
print output
它产生错误“太多值无法解包”
语句 summed.collect()
下方的错误消息
16/09/12 12:46:10 INFO deprecation: mapred.task.is.map is deprecated.
Instead, use mapreduce.task.ismap 16/09/12 12:46:10 INFO deprecation:
mapred.task.partition is deprecated. Instead, use
mapreduce.task.partition 16/09/12 12:46:10 INFO deprecation:
mapred.job.id is deprecated. Instead, use mapreduce.job.id 16/09/12
12:46:10 ERROR Executor: Exception in task 1.0 in stage 0.0 (TID 1)
org.apache.spark.api.python.PythonException: Traceback (most recent
call last): File
"/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.zip/pyspark/worker.py",
line 111, in main
process() File "/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.zip/pyspark/worker.py",
line 106, in process
serializer.dump_stream(func(split_index, iterator), outfile) File
"/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.zip/pyspark/serializers.py",
line 263, in dump_stream
vs = list(itertools.islice(iterator, batch)) File "", line 1, in ValueError: too many values to unpack
根据评论中的信息,消息 RDD 中的每一行包含 json 文件中的一行
u'{',
u' "header": {',
u' "platform":"atm",'
您的代码在以下行中失败:
parsed = messages.map(lambda (k,v): json.loads(v))
您的代码采用如下行:'{' 并尝试将其转换为键值,然后执行 json.loads(value)
显然python/spark无法将一个字符'{'分割成键值对
json.loads() 命令应该在完整的 json 数据对象上执行
使用纯 python
可能更容易完成此特定任务
首先,json是无效的。在 header 之后缺少一个 ,
。
话虽这么说,让我们来看看这个 json:
{"header":{"platform":"atm","version":"2.0"},"details":[{"abc":"3","def":"4"},{"abc":"5","def":"6"},{"abc":"7","def":"8"}]}
这可以通过以下方式处理:
>>> df = sqlContext.jsonFile('test.json')
>>> df.first()
Row(details=[Row(abc='3', def='4'), Row(abc='5', def='6'), Row(abc='7', def='8')], header=Row(platform='atm', version='2.0'))
>>> df = df.flatMap(lambda row: row['details'])
PythonRDD[38] at RDD at PythonRDD.scala:43
>>> df.collect()
[Row(abc='3', def='4'), Row(abc='5', def='6'), Row(abc='7', def='8')]
>>> df.map(lambda entry: (int(entry['abc']), int(entry['def']))).collect()
[(3, 4), (5, 6), (7, 8)]
希望对您有所帮助!
import pyspark
from pyspark import SparkConf
# You can configure the SparkContext
conf = SparkConf()
conf.set('spark.local.dir', '/remote/data/match/spark')
conf.set('spark.sql.shuffle.partitions', '2100')
SparkContext.setSystemProperty('spark.executor.memory', '10g')
SparkContext.setSystemProperty('spark.driver.memory', '10g')
sc = SparkContext(appName='mm_exp', conf=conf)
sqlContext = pyspark.SQLContext(sc)
data = sqlContext.read.json(file.json)
我觉得他错过了阅读序列的重要部分。您必须初始化一个 SparkContext。
当您启动 SparkContext 时,它还会在端口 4040 上启动一个 webUI。可以使用 http://localhost:4040 访问该 webUI。这是检查所有计算进度的有用位置。
尝试使用最新的 spark 版本。
df = spark.read.json('test.json')
我是 PySpark 的新手,下面是我来自 kafka 的 JSON 文件格式。
{
"header": {
"platform":"atm",
"version":"2.0"
}
"details":[
{
"abc":"3",
"def":"4"
},
{
"abc":"5",
"def":"6"
},
{
"abc":"7",
"def":"8"
}
]
}
如何详细阅读所有 "abc"
"def"
的值并将其添加到像这样的新列表 [(1,2),(3,4),(5,6),(7,8)]
。新列表将用于创建 spark 数据框。我如何在 pyspark.I 中执行此操作尝试了以下代码。
parsed = messages.map(lambda (k,v): json.loads(v))
list = []
summed = parsed.map(lambda detail:list.append((String(['mcc']), String(['mid']), String(['dsrc']))))
output = summed.collect()
print output
它产生错误“太多值无法解包”
语句 summed.collect()
16/09/12 12:46:10 INFO deprecation: mapred.task.is.map is deprecated. Instead, use mapreduce.task.ismap 16/09/12 12:46:10 INFO deprecation: mapred.task.partition is deprecated. Instead, use mapreduce.task.partition 16/09/12 12:46:10 INFO deprecation: mapred.job.id is deprecated. Instead, use mapreduce.job.id 16/09/12 12:46:10 ERROR Executor: Exception in task 1.0 in stage 0.0 (TID 1) org.apache.spark.api.python.PythonException: Traceback (most recent call last): File "/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.zip/pyspark/worker.py", line 111, in main process() File "/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.zip/pyspark/worker.py", line 106, in process serializer.dump_stream(func(split_index, iterator), outfile) File "/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 263, in dump_stream vs = list(itertools.islice(iterator, batch)) File "", line 1, in ValueError: too many values to unpack
根据评论中的信息,消息 RDD 中的每一行包含 json 文件中的一行
u'{',
u' "header": {',
u' "platform":"atm",'
您的代码在以下行中失败:
parsed = messages.map(lambda (k,v): json.loads(v))
您的代码采用如下行:'{' 并尝试将其转换为键值,然后执行 json.loads(value)
显然python/spark无法将一个字符'{'分割成键值对
json.loads() 命令应该在完整的 json 数据对象上执行
使用纯 python
可能更容易完成此特定任务首先,json是无效的。在 header 之后缺少一个 ,
。
话虽这么说,让我们来看看这个 json:
{"header":{"platform":"atm","version":"2.0"},"details":[{"abc":"3","def":"4"},{"abc":"5","def":"6"},{"abc":"7","def":"8"}]}
这可以通过以下方式处理:
>>> df = sqlContext.jsonFile('test.json')
>>> df.first()
Row(details=[Row(abc='3', def='4'), Row(abc='5', def='6'), Row(abc='7', def='8')], header=Row(platform='atm', version='2.0'))
>>> df = df.flatMap(lambda row: row['details'])
PythonRDD[38] at RDD at PythonRDD.scala:43
>>> df.collect()
[Row(abc='3', def='4'), Row(abc='5', def='6'), Row(abc='7', def='8')]
>>> df.map(lambda entry: (int(entry['abc']), int(entry['def']))).collect()
[(3, 4), (5, 6), (7, 8)]
希望对您有所帮助!
import pyspark
from pyspark import SparkConf
# You can configure the SparkContext
conf = SparkConf()
conf.set('spark.local.dir', '/remote/data/match/spark')
conf.set('spark.sql.shuffle.partitions', '2100')
SparkContext.setSystemProperty('spark.executor.memory', '10g')
SparkContext.setSystemProperty('spark.driver.memory', '10g')
sc = SparkContext(appName='mm_exp', conf=conf)
sqlContext = pyspark.SQLContext(sc)
data = sqlContext.read.json(file.json)
我觉得他错过了阅读序列的重要部分。您必须初始化一个 SparkContext。
当您启动 SparkContext 时,它还会在端口 4040 上启动一个 webUI。可以使用 http://localhost:4040 访问该 webUI。这是检查所有计算进度的有用位置。
尝试使用最新的 spark 版本。
df = spark.read.json('test.json')