簡體   English   中英

PySpark 從具有兩種不同文件類型的 s3 中的 zip 文件中讀取 csv

[英]PySpark read csv from zip file in s3 with two different file types

我有一個 zip 文件,其中有一個 CSV 和一個 json 映射文件。 我想將 csv 讀入 spark 數據幀,並將 json 映射文件讀入字典。 我已經完成了后面的部分:

import boto3

obj = s3.get_object(Bucket='bucket', Key='key')

z = zipfile.ZipFile(io.BytesIO(obj["Body"].read()))

csvjson = json.loads(z.open(files[1]).read().decode('utf-8'))

一般來說,我想執行以下操作以從 csv 文件中獲取 df:

dfRaw = spark.read \
    .format("text") \
    .option("multiLine","true") \
    .option("inferSchema","false") \
    .option("header","true") \
    .option("ignoreLeadingWhiteSpace","true") \
    .option("ignoreTrailingWhiteSpace","true") \
    .load(z.open(files[0]).read().decode('utf-8'))

然而這顯然不起作用,因為load()需要一個文件路徑,而不是行本身。 如何從 zip 文件中將該文件讀取到 spark 數據幀中?

由於您手動“解壓縮” CSV 文件並將 output 作為字符串,您可以使用parallelize如下

z = zipfile.ZipFile(io.BytesIO(obj["Body"].read()))
csv = [l.decode('utf-8').replace('\n', '') for l in z.open(files[0]).readlines()]

(spark
    .sparkContext
    .parallelize(csv)
    .toDF(T.StringType())
    .withColumn('value', F.from_csv('value', 'ID int, Trxn_Date string')) # your schema goes here
    .select('value.*')
    .show(10, False)
)

# Output
+----+----------+
|ID  |Trxn_Date |
+----+----------+
|null|Trxn_Date |
|100 |2021-03-24|
|133 |2021-01-22|
+----+----------+

暫無
暫無

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

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