web-dev-qa-db-ja.com

pysparkで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でこれを行うにはどうすればよいですか。以下のコードを試しました。

_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の廃止:mapred.task.is.mapは廃止されました。代わりに、mapreduce.task.ismap 16/09/12 12:46:10を使用してください。INFOdeprecation:mapred.task.partition is deprecated。代わりに、mapreduce.task.partition 16/09/12 12:46:10を使用してください。INFOdeprecation:mapred.job.id is deprecated。代わりに、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(最後の呼び出しが最後):メインプロセス内のファイル「/usr/hdp/2.3.4.0-3485/spark/python/lib/pyspark.Zip/pyspark/worker.py」の111行目、「/ usr/hdp/2.3.4.0」ファイル-3485/spark/python/lib/pyspark.Zip/pyspark/worker.py "、106行目、プロセス中serializer.dump_stream(func(split_index、iterator)、outfile)ファイル" /usr/hdp/2.3.4.0-3485 /spark/python/lib/pyspark.Zip/pyspark/serializers.py "、行263、dump_stream vs = list(itertools.islice(iterator、batch))ファイル" "、行1、ValueError:値が多すぎます開梱

5
anusha

まず、jsonが無効です。ヘッダーの後に, 不足している。

そうは言っても、この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)]

お役に立てれば!

4
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も起動します。webUIには http:// localhost:404 を使用してアクセスできます。これは、すべての計算の進行状況を確認するのに便利な場所です。

3
Gfranco008

コメントの情報によると、メッセージRDDの各行はjsonファイルの1行を保持しています

 u'{', 
 u' "header": {', 
 u' "platform":"atm",'

次の行でコードが失敗しています:

parsed = messages.map(lambda (k,v): json.loads(v))

あなたのコードは '{'のような行を取り、それをキー、値に変換して、json.loads(value)を実行しようとします

python/sparkが1つの文字「{」をキーと値のペアに分割できないことは明らかです。

Json.loads()コマンドは完全なjsonデータオブジェクトで実行する必要があります

この特定のタスクは、純粋なpythonで簡単に実行できます

0
Yaron