使用 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