簡體   English   中英

在 Python 中使用 Spark Core 組合來自 JSON 和 CSV 文件的數據

[英]Combining data from JSON and CSV files using Spark Core in Python

嘗試編寫一個 Python 腳本,該腳本從 Google Drive 文件中獲取一個 JSON 文件和多個 CSV 文件,並僅使用 Spark Core 分析和操作其數據。

此代碼的 function 是用 JSON 和 CSV 文件中的數據創建元組。 這兩個文件共享一個共同的信息項,這是每個文件(json 和 csv)中的第一項,對應於一個字符串。 在前面的示例中,此項對應於 object“1111”。 此項目是一個“代碼”(例如:1111、123、12345...),存在於 csv 文件的每一行中,與 json 文件中的“item1”相關聯。 相同“代碼”下的 csv 文件中可能有很多行,因此腳本會處理這些信息,您將在前面看到。

json 文件中的數據采用以下格式:

[{"item1":"1111","item2":"aaaaaa","item3":"bbbbbbb"},{"item1":"123",...},...

和 csv:

1111;SDS111;99.999;2.222
123;SDS222;333.111;4.111
...

打印的元組將是來自 json 和 csv 文件的數據的組合,由這個“代碼”聯合起來。 目標是編寫一些東西,對於 json 文件中的每個元素都標識“代碼”,如果“代碼”等於 csv 文件中的第一項,則打印出一個包含來自兩個文件的數據的元組,例如:

('aaaaaa', 'bbbbbbb', '1111', 'SDS111', (99.999, 2.222))
('ccccccccc', 'ddddd', '123', 'SDS222', (333.111, 4.111))
...

目前,我的代碼設法讀取 json 文件並從中創建元組,並處理存儲在 csv 中的數據:

import json
import pyspark

sc = pyspark.SparkContext('local[*]')
try:
  with open("/content/drive/../file.json") as f:
    data = json.load(f)
    rdd = sc.parallelize(data)
    json_data = rdd.map(lambda item: (item["item1"], item["item2"], item["item3"]))

  lines = sc.textFile('/content/drive/../file*.csv', 5) \
          .map(lambda line: line.strip()) \
          .filter(lambda line: len(line.split(';')) == 4)

  csv_data = lines.map(lambda line: line.split(';')) \
          .map(lambda values: (values[0], float(values[2]), float(values[3]))) \
          .map(lambda kv: (kv[0], (kv[1], kv[2]))) \
          .reduceByKey(lambda a, b: (max(a[0] + b[0]), max(a[1] + b[1]))) \
          .map(lambda kv: (kv[0], (kv[1][1], kv[1][2]))) \
          .sortByKey()

  #combination part???

  sc.stop()
except Exception as e: 
  print(e)
  sc.stop()

我真的很難處理腳本的這一部分,非常感謝您的幫助! 如果需要,請隨時向我詢問更多信息

為什么要使用低級命令。 除非萬不得已,否則沒有人會使用 rdd 調用。 我建議改用 PySpark。 解決方案非常簡單。

此代碼位於 Azure Databricks 中。 編寫樣本 json 文件。

#
#  1 - Create sample json file
#

# some text
data = """
[
{"item1":"111","item2":"aaaaaa","item3":"bbbbbbb"},
{"item1":"123","item2":"cccccc","item3":"ddddddd"}
]
"""

# write file
path = "/tmp/stackoverflow.json"
dbutils.fs.put(path, data, True)

創建樣本 csv 文件。

#
#  2 - Create sample csv file
#

# some text
data = """
111;SDS111;99.999;2.222
123;SDS222;333.111;4.111
"""


# write file
path = "/tmp/stackoverflow.csv"
dbutils.fs.put(path, data, True)

讀取一個或多個 csv 文件並創建一個名為“tmp_csv_data”的臨時 hive 視圖。

#
#  3 - Read csv data
#

# file location
path = "/tmp/*.csv"

# make dataframe
df1 = spark.read.format("csv") \
  .option("header", "false") \
  .option("sep", ";") \
  .schema("item1 string, label1 string, value1 float, value2 float") \
  .load(path)

# make temp hive view
df1.createOrReplaceTempView("tmp_csv_data")

讀取一個或多個 json 文件並創建一個名為“tmp_json_data”的臨時 hive 視圖。

#
#  4 - Read json data
#

# file location
path = "/tmp/*.json"

# make dataframe
df1 = spark.read.format("json") \
  .schema("item1 string, item2 string, item3 string") \
  .load(path)

# make temp hive view
df1.createOrReplaceTempView("tmp_json_data")

讓我們快速瀏覽一下 csv 視圖。

在此處輸入圖像描述

讓我們快速瀏覽一下 json 視圖。 請注意,格式錯誤的 JSON 文件會創建兩條空白記錄。

在此處輸入圖像描述

下圖顯示了合並后的兩個數據集 dataframe。只需使用 spark.write() 創建最終文件。

在此處輸入圖像描述

此代碼簡單明了,並利用了大多數人已經具備的 ANSI SQL 技能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM