一个python包,用于通过amazon athena查询数据并将其带到pandas df中

pydbtools的Python项目详细描述


pydbtools

这是一个简单的包,让我们使用Amazon Athena查询数据库,并获得指向Athena的s3路径(作为csv)这比使用数据库驱动程序要快得多,因此在拉入大数据时可能是一个不错的选择。默认情况下,数据转换为pandas数据框,其列数据类型与athena表相同-请参阅下面的“元数据”部分。

注意:要使用此包,需要将您添加到分析平台上的StandardDatabaseAccess IAM策略中。如果需要访问,请与团队联系。

要安装…

pip install pydbtools

或者从Github…

pip install git+git://github.com/moj-analytical-services/pydbtools.git#egg=pydbtools

包装要求如下:

  • pandas(预装)
  • boto3(预装)
  • numpy(预装)
  • s3fs
  • gluejobutils

用法

使用pydbtools的最简单方法。这将返回数据的pandas df reprentation(带有匹配的元数据)。

importpydbtoolsaspydb# Run SQL query and return as a pandas dfdf=pydb.read_sql("SELECT * from database.table limit 10000")df.head()

您可能需要自己转换数据或将所有列作为字符串读取

importpydbtoolsaspydb# Run SQL query and return as a pandas dfdf=pydb.read_sql("SELECT * from database.table limit 10000",cols_as_str=True)df.head()df.dtypes# all objects

您还可以将其他参数传递给pandas.read_csv,后者读取生成的雅典娜SQL查询。 注意不能传递dtype,因为它是在read_sql函数中指定的。

importpydbtoolsaspydb# pass nrows parameter to pandas.read_csv functionpydb.read_sql("SELECT * from database.table limit 10000",nrows=20)

如果不想将数据读入pandas,可以运行sql查询并获取s3路径和元数据 使用get_atena_query_响应的输出。然后使用boto3iocsv读取数据

importpydbtoolsaspydbimportioimportcsvimportboto3response=pydb.get_athena_query_response("SELECT * from database.table limit 10000")# print out path to athena query output (as a csv)print(response['s3_path'])# print out meta dataprint(response['meta'])# Read the csv into a string in memorys3_resource=boto3.resource('s3')bucket,key=response['s3_path'].replace("s3://","").split('/',1)obj=s3_resource.Object(bucket,key)text=obj.get()['Body'].read().decode('utf-8')# Use csv reader to print the outputting csvreader=csv.reader(text.split('\n'),delimiter=',')forrowinreader:print('\t'.join(row))

元数据

get_atena_query_response(…)的输出是一个字典,它的键之一是meta。元键是一个列表,其中该列表中的每个元素都是Athena查询输出中每个列的名称(name)和数据类型(type)。例如,对于此表输出:

col1col2
12018-01-01
22018-01-02
...

会有一个类似于:

forminresponse['meta']:print(m['name'],m['type'])

输出:

> col1 int
> col1 date

元类型遵循那些列为etl_manager中使用的通用元数据类型的类型。如果您想要实际的雅典娜元数据,可以通过将return_athena_types输入参数设置为True来获得它们,而不是一般的元数据类型,例如

response=pydb.get_athena_query_response("SELECT * from database.table limit 10000",return_athena_types=True)print(response['meta'])

如果希望直接将SQL查询读入Pandas数据框,可以使用read_sql函数。您可以将*args**kwargs应用于此函数,并将其传递给pd.read_csv()

importpydbtoolsaspydbdf=pydb.read_sql("SELECT * FROM database.table limit 1000")df.head()

元数据转换

下表说明了从数据类型到pandas df的转换(使用read_sql函数):

data typepandas column typeComment
characterobjectsee here
intnp.float64Pandas integers do not allow nulls so using floats
longnp.float64Pandas integers do not allow nulls so using floats
datepandas timestamp
datetimepandas timestamp
booleannp.bool
floatnp.float64
doublenp.float64

注意:

  • 亚马逊雅典娜使用一种称为presto docs的sql风格,可以找到here
  • 要查询雅典娜中的日期列,需要指定值是日期,例如SELECT * FROM db.table WHERE date_col > date '2018-12-31'
  • 要查询雅典娜中的datetime或timestamp列,您需要指定您的值是一个timestamp,例如SELECT * FROM db.table WHERE datetime_col > timestamp '2018-12-31 23:59:59'
  • 注意上面使用的日期和日期时间格式查看有关日期和日期时间的详细信息here
  • 若要在SQL查询中指定字符串,请始终使用“”而不是“”。使用“”表示您正在引用数据库、表或列等。
  • 当数据被拉回到rstudio中时,列类型要么是r字符(对于日期、日期时间、字符的任何列),要么是doubles(对于其他所有列)。

有关版本更改,请参见更改日志

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

推荐PyPI第三方库


热门话题
java Hibernate:合并并删除,而不是从数据库中删除实体对象   java如何在WebFilter中有条件地从Mono返回?   java调用mysql c3p0函数   可执行jar Java jar文件加载错误:无法找到或加载主类。类导致的错误:java。lang.ClassNotFoundException:某些东西。班   java如何减少/更改爬网后的延迟?   从其他语言(如Java、PHP、Perl、Python等)调用C/C++代码的最佳方式是什么?   java如何模拟影响对象的void返回方法   当我试图在ubuntu上启动JavaScala时,它抛出了一个异常   java如何正确输出游戏   理解java和C++背景下的JavaScript原型   oracle如何将Java函数转换为postgresql函数   多线程为什么我的java服务器程序在超时后不退出?   java如何使listView中的按钮在单击时工作?   试图将这个嵌套的java forloop转换为python,但我不知道如何转换。有没有一种方法可以像这样为循环执行if语句?   java幂函数在计算器中的应用   如何在java中滚动浏览mysql数据库   在Spring Boot应用程序的JUnit测试中,java没有符合自动连线JPA存储库要求的bean   java如何使用扩展类的JPanel对象?