使用athena/spectrum/hive风格分区编写和读取/查询s3拼花数据。

s3parq的Python项目详细描述


s3parq

在s3中对配置单元样式的分区数据进行拼花文件管理

这是什么?

在许多方面,拼花标准仍然是数据的狂野西部。根据您的分区样式、元数据存储策略等,您可以用多种不同的方法来解决大数据量问题。 这是一个特定于aws的解决方案,旨在充当python程序和任何用于访问此数据的工具之间的接口。s3parq是一个端到端的解决方案,用于:

  1. 将pandas数据帧中的数据作为分区拼花写入s3。
  2. 从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时,记住所需的集合可能会让人困惑。您可以参考以下图表: venn diagram of reverse valuetable of difference values

贡献

我们欢迎拉要求! 一些基本准则:

  • test yo'代码。代码覆盖率很重要!
  • 要有礼貌。在PR注释、代码注释等中;

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
尝试通过java驱动程序连接时,mongodb服务器上的SSLhandshake失败   使用PlayFramework的Azure网站中的java Logback   java在另一个ArrayList中使用ArrayList处理复杂的JSON响应   java无法在另一台机器上运行eclipse tomcat中的war文件   java GZIPOutputStream有什么替代方案吗?   java Nashorn调试在Nashorn中运行的javascript   java文本短信未发送,即使toast显示已发送   java Hibernatesearch 5.0 spatial不确定是否在散列中存储lat/lon   java我想创建一个带有文本视图的计数器   java安卓:如何正确地同步资源   java使用mockito。当不知道方法调用的参数时   firebase Java使用HTTP v1发送错误字符的中文通知   java Hibernate无法映射到表?   java使用对象映射器解析复杂JSON   java Selenium Grid 2并行测试用例执行   java所有项目在列表视图中重复