[英]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.