使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中

Posted

技术标签:

【中文标题】使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中【英文标题】:store parquet files (in aws s3) into a spark dataframe using pyspark 【发布时间】:2021-06-09 17:01:54 【问题描述】:

我正在尝试从我的 s3 存储桶中的特定文件夹中读取数据。此数据采用镶木地板格式。为此,我使用awswrangler:

import awswrangler as wr

# read data
data = wr.s3.read_parquet("s3://bucket-name/folder/with/parquet/files/", dataset = True)

这会返回一个熊猫数据框:

client_id   center  client_lat  client_lng  inserted_at  matrix_updated
0700292081   BFDR    -23.6077    -46.6617   2021-04-19     2021-04-19   
7100067781   BFDR    -23.6077    -46.6617   2021-04-19     2021-04-19   
7100067787   BFDR    -23.6077    -46.6617   2021-04-19     2021-04-19     

但是,我希望将从我的 s3 存储桶中检索到的数据存储在 spark 数据框中,而不是 pandas 数据框。我试过this(这是我自己的问题),但似乎不能正常工作。

我想知道是否有任何方法可以使用 awswrangler 将这些数据存储到 spark 数据框中。或者,如果您有其他选择,我想了解一下。

【问题讨论】:

为什么不使用原生的spark.read.parquet(PATH) 方法呢?另一种选择是 spark.createDataFrame(data)。 我认为spark.read.parquet(PATH) 用于本地文件,spark.createDataFrame(data) 不是最好的方法,因为这个想法是完全避免使用 pandas 数据帧。这就是为什么我正在寻找一种可以将数据直接存储在 spark 数据框中的解决方案。 不确定我是否理解。你是什​​么意思“本地文件”?当文件在云中时,我每天都从 s3 读取。 我经常使用spark.read.parquet(PATH)从我的机器上读取文件。我不确定如何使用该代码从 s3 读取文件。 我所做的是 - spark.read.parquet("s3://bucket-name/folder/with/parquet/files/")。如果镶木地板文件在那里,它应该可以工作。 【参考方案1】:

我没有使用awswrangler。相反,我使用了在github 上找到的以下代码:

myAccessKey = 'your key' 
mySecretKey = 'your key'

import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0 pyspark-shell'

import pyspark
sc = pyspark.SparkContext("local[*]")

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoopConf.set("fs.s3.awsAccessKeyId", myAccessKey)
hadoopConf.set("fs.s3.awsSecretAccessKey", mySecretKey)

df = sqlContext.read.parquet("s3://bucket-name/path/")

【讨论】:

以上是关于使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark 将镶木地板文件加载到 Hive 表中?

如何将镶木地板文件从 s3 导入到 postgresql rds

awswrangler 将镶木地板数据帧写入单个文件

将镶木地板文件读入数据框时如何为文件夹结构指定架构[重复]

AWS Redshift:如何存储大小大于 100K 的文本字段

将镶木地板文件加载到红移时如何格式化时间戳字段?