一个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_响应的输出。然后使用boto3
、io
和csv
读取数据
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
)。例如,对于此表输出:
col1 | col2 |
---|---|
1 | 2018-01-01 |
2 | 2018-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 type | pandas column type | Comment |
---|---|---|
character | object | see here |
int | np.float64 | Pandas integers do not allow nulls so using floats |
long | np.float64 | Pandas integers do not allow nulls so using floats |
date | pandas timestamp | |
datetime | pandas timestamp | |
boolean | np.bool | |
float | np.float64 | |
double | np.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(对于其他所有列)。
有关版本更改,请参见更改日志