通过过滤列表选择键

时间:2019-07-19 11:26:47

标签: python pyspark

我有一个包含字典的json文件,在其中有各种键值。一个键包含其他键值。

{u'op': u'mcm', u'pt':015, u'mc': [{u'marketDefinition': {u'discountAllowed': False, u'version': 2199687037, u'inPlay': False], u'clk': u'6578852476'} 

在我拥有的某些文件中,'marketDefinition'键不存在。因此,我只想在此处读取/计数具有“ marketDefinition”键的文件

我尝试了这段代码,但是由于相关密钥没有出现在某些文件中,因此该代码无法运行

r=sc.binaryFiles("path").mapValues(extractFiles).mapValues(reconvertToJson).flatMapValues(json.loads)

r.values().filter(lambda x: x['mc'] is not None).flatMap(lambda x:
x['mc']).filter(lambda x: x['marketDefinition'] is not None).count()

输出:

  

Py4JJavaError:调用时发生错误   z:org.apache.spark.api.python.PythonRDD.collectAndServe。 :   org.apache.spark.SparkException:由于阶段失败,作业中止了:   94.0阶段中的任务0失败4次,最近一次失败:丢失的任务   在阶段94.0中为0.3(TID 931,ip-172-31-168-121.eu-west-1.compute.internal,执行者5):   org.apache.spark.api.python.PythonException:追溯(最新   最后调用):文件   “ /mnt3/yarn/usercache/zeppelin/appcache/application_1563524055689_0001/container_1563524055689_0001_01_000006/pyspark.zip/pyspark/worker.py”,   372行,主要       process()文件“ /mnt3/yarn/usercache/zeppelin/appcache/application_1563524055689_0001/container_1563524055689_0001_01_000006/pyspark.zip/pyspark/worker.py”,   367行,进行中       serializer.dump_stream(func(split_index,iterator),outfile)文件“ /usr/lib/spark/python/lib/pyspark.zip/pyspark/rdd.py”,行   2499,在pipeline_func文件中   “ /usr/lib/spark/python/lib/pyspark.zip/pyspark/rdd.py”,第2499行,在   pipeline_func文件   “ /usr/lib/spark/python/lib/pyspark.zip/pyspark/rdd.py”,第2499行,在   pipeline_func文件   “ /usr/lib/spark/python/lib/pyspark.zip/pyspark/rdd.py”,第352行,在   func文件“ /usr/lib/spark/python/lib/pyspark.zip/pyspark/rdd.py”,   文件中的第1055行   “ /usr/lib/spark/python/lib/pyspark.zip/pyspark/rdd.py”,第1055行,在      文件   “ /mnt3/yarn/usercache/zeppelin/appcache/application_1563524055689_0001/container_1563524055689_0001_01_000006/pyspark.zip/pyspark/util.py”,   包装中的第99行       在KeyError:“ marketDefinition”中,返回f(* args,** kwargs)文件“”的第2行

如何仅使用marketDefinition键读取文件?非常感谢!!

0 个答案:

没有答案