使用athena/spectrum/hive风格分区编写和读取/查询s3拼花数据。
s3parq的Python项目详细描述
s3parq
在s3中对配置单元样式的分区数据进行拼花文件管理
这是什么?
在许多方面,拼花标准仍然是数据的狂野西部。根据您的分区样式、元数据存储策略等,您可以用多种不同的方法来解决大数据量问题。 这是一个特定于aws的解决方案,旨在充当python程序和任何用于访问此数据的工具之间的接口。s3parq是一个端到端的解决方案,用于:
- 将pandas数据帧中的数据作为分区拼花写入s3。
- 从s3parq创建的s3分区拼花读取数据到pandas数据帧。
注意:s3parq在任何文件i/o之前将元数据写入(和读取)到用于过滤记录的s3对象中;这使选择数据集更快,但也意味着您需要使用s3parq写入数据才能使用s3parq读取它。
tldr-要使用s3parq进行读取,您需要使用s3parq进行写入
基本用法
我们按数据集名称获取数据。
import s3parq as parq
bucket = 'mybucket'
key = 'path-in-bucket/to/my/dataset'
dataframe = pd.DataFrame(['some_big_data'])
## writing to s3
parq.publish( bucket=bucket,
key=key,
dataframe=dataframe,
partitions= ['column1',
'column2'])
## reading from s3, getting only records with an id >= 150
pandas_dataframe = parq.fetch( bucket=bucket,
key=key,
filter= {"partition":'id',
"values":150,
"comparison":'>='})
< H2>获取现有分区值< /H2>很多预筛选都涉及到根据另一个数据集中已经存在的值修剪数据集。为了更简单,s3parq提供了一些超级有用的助手函数:
partition = 'order_id'
## max value for order_id column, correctly typed
max_val = parq.get_max_partition_value(bucket,
key,
partition)
## partition values not in a list of order_ids.
## if partition values are 1-6 would return [5,6] correctly typed.
list_of_vals = [0,1,2,3,4]
new_vals = parq.get_diff_partition_values( bucket,
key,
partition,
list_of_vals)
## list values not in partition value list
## if partition values are 3-8 would return [1,2] correctly typed.
list_of_vals = [1,2,3,4]
missing_vals = parq.get_diff_partition_values( bucket,
key,
partition,
list_of_vals,
True)
## df of values in one dataset's partition and not another's
## this works by input -> where extra values would be, and comparison -> where they might not be
## similar to the get_diff_partition_values but handles it at the dataset level
missing_data = parq.fetch_diff( input_bucket,
input_key,
comparison_bucket,
comparison_key,
partition)
## all values for a partition
all_vals = parq.get_all_partition_values( bucket,
key,
partition)
红移光谱
可以选择在aws红移频谱中查询发布到s3的数据帧。要启用此功能,必须在redshift中配置外部数据库。有关在redshift中设置数据库的帮助,请参见AWS docs。要在s3parq中启用此功能,只需通过redshift参数将配置字典传递给publish()
。
redshift_params
是一个字典,必须包含以下键:values(除非另有说明,否则值都是字符串):
- schema_name:要向其中添加表名的架构的名称
- table_name:要在redshift中创建的表的名称
- iam_role:arn链接到具有读/写频谱权限的iam角色
- 地区:AWS地区(例如US-EAST-1)
- cluster_id:cluster redshift的名称配置在
- 主机:群集id中指定的群集的url
- 端口:连接到redshift的端口(通常为5439)
- dBNEXNE:使用红移谱 配置的(现有)外部数据库的名称
如果redshift参数存在但无效,则整个publish()
将失败。
注意:频谱模式不作为普通数据库模式工作。表是redshift频谱数据库的全局表,因此属于db_name
的每个模式都可以访问所有表,而不管它们是用什么模式创建的。不同的表注册表需要不同的红移频谱数据库,而不是模式。
有问题
筛选器只能应用于分区;这是因为在筛选完成之前,我们实际上不会下拉任何数据。这与数据最佳实践一致;您经常过滤的内容是您应该分区的内容!
当使用
get_diff_partition_values
时,记住所需的集合可能会让人困惑。您可以参考以下图表:
贡献
我们欢迎拉要求! 一些基本准则:
- test yo'代码。代码覆盖率很重要!
- 要有礼貌。在PR注释、代码注释等中;