s3 に保存されている複数の JSON ファイル (3K+) から読み取る必要があり、それらはすべて同じ構造を持っています。構造は非常に大きく、ネストされています。これらのファイル内には、オブジェクト、キー:値のペアを含む配列があります。これらのキーのいくつかを選択し、値を PySpark データフレームに書き出す必要があります。PySpark/Python3 を使用して、AWS Glue 内でコードを記述しています。
これまで、S3 ファイルからデータフレームを作成し、スキーマを推測しようとしました。これが正しいかどうかも、これが最も効率的かどうかもわかりません。また、「Products」配列を見つけて、配列内からいくつかのキーを抽出するために、次にこれをどこに持っていくべきかわかりません。
json_data_frame = spark.read.json("s3://" + args['destinationBucketName'] + "/" + args['s3SourcePath'])
json_schema = spark.read.json(json_data_frame.rdd.map(lambda row: row.json)).schema
私の望む結果は、それぞれが配列のキーであり、s3 ファイル全体のすべての値を持つ列を含むデータフレームです。
編集:私はそれをもう少し進めました:
json_data_frame = spark.read.option("multiLine", True).option("mode", "PERMISSIVE").json("s3://" + args['destinationBucketName'] + "/" + args['s3SourcePath'])
final_data_frame_prep = json_data_frame.withColumn("name", json_data_frame["products"].getItem("name")).withColumn("ndc_product_code", json_data_frame["products"].getItem("ndc_product_code"))
final_data_frame = final_data_frame_prep.select("name","ndc_product_code")
final_data_frame.show(20,False)
私が今いる場所では、各値がリストであり、いくつかは単一のアイテムで、いくつかは倍数であるという例外を除いて、私が疑うようにデータフレームが作成されています。ここで、リストを別々の行に分割する必要があります。アドバイス等ありましたらよろしくお願いします。現在のデータフレーム:
+------------------+----------------------+
|name |ndc_product_code |
+------------------+----------------------+
|[Refludan] |[50419-150] |
|[Erbitux, Erbitux]|[66733-948, 66733-958]|
+------------------+----------------------+
EDIT2:
json_data_frame = spark.read.option("multiLine", True).option("mode", "PERMISSIVE").json("s3://" + args['destinationBucketName'] + "/" + args['s3SourcePath'])
final_data_frame_prep = json_data_frame.withColumn("name", explode(json_data_frame["products"].getItem("name"))).withColumn("ndc_product_code", explode(json_data_frame["products"].getItem("ndc_product_code"))).withColumn("dosage_form", explode(json_data_frame["products"].getItem("dosage_form"))).withColumn("strength", explode(json_data_frame["products"].getItem("strength")))
final_data_frame = final_data_frame_prep.select("name","ndc_product_code","dosage_form","strength")
final_data_frame.show(20,False)
コードと残りの 2 つの列に爆発を追加することができましたが、データフレームに重複が見られます。キーの元の配列内のオブジェクトに一致するのではなく、リストがすべての可能性に一致するかのようです。データフレームは次のとおりです。
+--------+----------------+-----------+---------+
|name |ndc_product_code|dosage_form|strength |
+--------+----------------+-----------+---------+
|Refludan|50419-150 |Powder |50 mg/1mL|
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-948 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
|Erbitux |66733-958 |Solution |2 mg/1mL |
+--------+----------------+-----------+---------+
EDIT3:爆発が私が望むものだとは思いません。コードを編集 1 に戻しました。表は次のように表示されます。
+------------------+----------------------+
|name |ndc_product_code |
+------------------+----------------------+
|[Refludan] |[50419-150] |
|[Erbitux, Erbitux]|[66733-948, 66733-958]|
+------------------+----------------------+
そして私が望むのは:
+------------------+----------------------+
|name |ndc_product_code |
+------------------+----------------------+
|[Refludan]|[50419-150]|
|[Erbitux]|[66733-948]|
|[Erbitux]|[66733-958]|
+------------------+----------------------+
これを行う方法はありますか?つまり、配列内の位置を一致させ、それに基づいて新しい行を作成しますか?