Je suis nouveau sur PySpark, voici mon format de fichier JSON de kafka.
{
"header": {
"platform":"atm",
"version":"2.0"
}
"details":[
{
"abc":"3",
"def":"4"
},
{
"abc":"5",
"def":"6"
},
{
"abc":"7",
"def":"8"
}
]
}
comment puis-je lire les valeurs de tous les "abc"
"def"
en détail et ajouter ceci à une nouvelle liste comme celle-ci [(1,2),(3,4),(5,6),(7,8)]
. La nouvelle liste sera utilisée pour créer une trame de données spark. Comment puis-je faire cela dans pyspark. J'ai essayé le code ci-dessous.
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
Il produit l'erreur 'trop de valeurs à décompresser'
Message d'erreur ci-dessous à l'instruction summed.collect()
16/09/12 12:46:10 INFO obsolète: mapred.task.is.map est obsolète. Utilisez plutôt mapreduce.task.ismap 16/09/12 12:46:10 INFO obsolète: mapred.task.partition est obsolète. Utilisez plutôt mapreduce.task.partition 16/09/12 12:46:10 INFO obsolète: mapred.job.id est obsolète. À la place, utilisez mapreduce.job.id 16/09/12 12:46:10 ERREUR Exécuteur: exception dans la tâche 1.0 à l'étape 0.0 (TID 1) org.Apache.spark.api.python.PythonException: Traceback (dernier appel en dernier ): Fichier "/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.Zip/pyspark/worker.py", ligne 111, dans le processus principal () Fichier "/usr/hdp/2.3.4.0 -3485/spark/python/lib/pyspark.Zip/pyspark/worker.py ", ligne 106, en cours serializer.dump_stream (func (split_index, iterator), outfile) File" /usr/hdp/2.3.4.0-3485 /spark/python/lib/pyspark.Zip/pyspark/serializers.py ", ligne 263, dans dump_stream vs = list (itertools.islice (itérateur, batch)) Fichier" ", ligne 1, dans ValueError: trop de valeurs à déballer
Tout d'abord, le json n'est pas valide. Après l'en-tête, un ,
est manquant.
Cela étant dit, prenons ce json:
{"header":{"platform":"atm","version":"2.0"},"details":[{"abc":"3","def":"4"},{"abc":"5","def":"6"},{"abc":"7","def":"8"}]}
Cela peut être traité par:
>>> 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)]
J'espère que cela t'aides!
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)
J'ai l'impression qu'il a raté une partie importante de la séquence de lecture. Vous devez initialiser un SparkContext.
Lorsque vous démarrez un SparkContext, il fait également tourner une webUI sur le port 4040. La webUI est accessible à l'aide de http: // localhost: 404 . C'est un endroit utile pour vérifier la progression de tous les calculs.
Selon les informations dans les commentaires, chaque ligne des messages RDD contient une ligne du fichier json
u'{',
u' "header": {',
u' "platform":"atm",'
Votre code échoue sur la ligne suivante:
parsed = messages.map(lambda (k,v): json.loads(v))
Votre code prend la ligne comme: '{' et essayez de le convertir en clé, valeur et exécutez json.loads (valeur)
il est clair que python/spark ne pourra pas diviser un caractère '{' en paire clé-valeur.
La commande json.loads () doit être exécutée sur un objet de données json complet
Cette tâche spécifique pourrait être accomplie plus facilement avec du python pur