【问题标题】:how to read parquet file from s3 using boto3如何使用 boto3 从 s3 读取镶木地板文件
【发布时间】:2021-12-28 18:17:03
【问题描述】:

我在 s3 存储桶 (s3://mybucket/my/path/) 中几乎没有镶木地板文件。我想使用 boto3 将其读入 spark 数据帧。

由于现有的安全性,我无法将其直接读取为 spark.read.parquet('s3://mybucket/my/path/') 。所以,需要使用 boto3 来阅读。

在尝试使用以下代码读取单个镶木地板文件 (s3://mybucket/my/path/myfile1.parquet) 时,出现错误。

res = autorefresh_session.resource('s3')
bucket = res.Bucket(name=mybucket)
obj = bucket.objects.filter(prefix=/my/path)
body = io.BytesIO(obj.get()['Body'].read())
spark.read.parquet(body).show()

Py4JJavaError:调用 xyz.parquet 时出错。 : java.lang.ClassCastException: java.util.ArrayList 不能转换为 java.lang.String 在 org.apache.spark.sql.DataFrameReader.preprocessDeltaLoading(DataFrameReader.scala:282)

谁能告诉我如何使用 boto3 读取单个文件并完成文件夹?

我可以使用上述方法成功读取 csv 文件,但不能读取 parquet 文件。 我可以将单个文件读入 pandas df 然后 spark,但这不是一种有效的读取方式。

【问题讨论】:

    标签: amazon-s3 pyspark boto3


    【解决方案1】:

    您可以使用以下步骤。

    步骤 01:读取 parquet s3 位置并转换为 panda 数据框。 ref

    import pyarrow.parquet as pq
    import s3fs
    s3 = s3fs.S3FileSystem()
    
    pandas_dataframe = pq.ParquetDataset('s3://your-bucket/', filesystem=s3).read_pandas().to_pandas()
    

    Step-02 : 将 panda 数据帧转换为 spark 数据帧:

    # Spark to Pandas
    df_pd = df.toPandas()
    
    # Pandas to Spark
    df_sp = spark_session.createDataFrame(df_pd)
    

    【讨论】:

    • 使用 boto3 读取 pandas 数据帧可以正常工作,但是当文件很大时,这不是一种有效的方法。
    猜你喜欢
    • 2019-12-07
    • 2019-10-27
    • 2017-01-22
    • 2021-10-20
    • 2017-12-18
    • 2019-04-07
    • 1970-01-01
    • 2018-08-13
    • 2018-05-06
    相关资源
    最近更新 更多