【问题标题】:Querying Athena tables in AWS Glue Python Shell在 AWS Glue Python Shell 中查询 Athena 表
【发布时间】:2019-07-23 14:46:12
【问题描述】:

AWS Glue 中引入了 Python Shell 作业。他们提到:

您现在可以使用 Python shell 作业,例如,将 SQL 查询提交到服务,例如... Amazon Athena ...

好的。我们有一个从 Athena 表 here 读取数据的示例:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

glueContext = GlueContext(SparkContext.getOrCreate())

persons = glueContext.create_dynamic_frame.from_catalog(
             database="legislators",
             table_name="persons_json")
print("Count: ", persons.count())
persons.printSchema()
# TODO query all persons

但是,它使用 Spark 而不是 Python Shell。没有通常可用于 Spark 作业类型的此类库,我有一个错误:

ModuleNotFoundError:没有名为“awsglue.transforms”的模块

如何重写上面的代码以使其在 Python Shell 作业类型中可执行?

【问题讨论】:

  • 你有没有想过这个问题?我也有同样的问题?
  • 我为我解决了这个问题。请查看我对刚刚发布的问题的回答。

标签: python amazon-web-services aws-glue


【解决方案1】:

问题是,Python Shell 类型有自己有限的一组内置 libraries。

我只是使用Boto 3 查询数据和Pandas 将其读入数据框来实现我的目标。

这里是sn-p的代码:

import boto3
import pandas as pd

s3 = boto3.resource('s3')
s3_client = boto3.client('s3')
athena_client = boto3.client(service_name='athena', region_name='us-east-1')
bucket_name = 'bucket-with-csv'
print('Working bucket: {}'.format(bucket_name))

def run_query(client, query):
    response = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={ 'Database': 'sample-db' },
        ResultConfiguration={ 'OutputLocation': 's3://{}/fromglue/'.format(bucket_name) },
    )
    return response

def validate_query(client, query_id):
    resp = ["FAILED", "SUCCEEDED", "CANCELLED"]
    response = client.get_query_execution(QueryExecutionId=query_id)
    # wait until query finishes
    while response["QueryExecution"]["Status"]["State"] not in resp:
        response = client.get_query_execution(QueryExecutionId=query_id)

    return response["QueryExecution"]["Status"]["State"]

def read(query):
    print('start query: {}\n'.format(query))
    qe = run_query(athena_client, query)
    qstate = validate_query(athena_client, qe["QueryExecutionId"])
    print('query state: {}\n'.format(qstate))

    file_name = "fromglue/{}.csv".format(qe["QueryExecutionId"])
    obj = s3_client.get_object(Bucket=bucket_name, Key=file_name)
    return pd.read_csv(obj['Body'])

time_entries_df = read('SELECT * FROM sample-table')

【讨论】:

  • 您可以将自己的库带到 python shell 作业中,例如 pypi.org/project/PyAthena
  • 您的回答几乎完全符合我的期望,谢谢!但是,您没有指定输出文件格式,将它们读取为 CSV,但实际上它们是 TXT。所以 panda 不能用pd.read_csv(obj['Body']) 读取它们。有什么选项可以强制输出为 CSV 吗?
  • @Jérémy,在我的例子中,输出已经是 CSV 格式,或者我已经不太记得实现细节了。
【解决方案2】:

SparkContext 在 Glue Python Shell 中不可用。因此,您需要依赖 Boto3 和 Pandas 来处理数据检索。但是使用 boto3 查询 Athena 并轮询 ExecutionId 以检查查询执行是否完成会带来很多开销。

最近 awslabs 发布了一个名为 AWS Data Wrangler 的新软件包。它将 Pandas 库的功能扩展到 AWS,以便与 Athena 和许多其他 AWS 服务轻松交互。

参考链接:

  1. https://github.com/awslabs/aws-data-wrangler
  2. https://github.com/awslabs/aws-data-wrangler/blob/master/tutorials/006%20-%20Amazon%20Athena.ipynb

注意: AWS Data Wrangler 库在 Glue Python shell 中默认不可用。要将其包含在 Python shell 中,请按照以下链接中的说明进行操作:

https://aws-data-wrangler.readthedocs.io/en/latest/install.html#aws-glue-python-shell-jobs

【讨论】:

    【解决方案3】:

    我有几个月用胶水,我用:

    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    
    sc = SparkContext()
    glueContext = GlueContext(sc)
    spark = glueContext.spark_session
    
    data_frame = spark.read.format("com.databricks.spark.csv")\
        .option("header","true")\
        .load(<CSVs THAT IS USING FOR ATHENA - STRING>)
    

    【讨论】:

    • 使用我的代码ModuleNotFoundError: No module named 'pyspark'。你确定你的工作类型是“Python Shell”(不是“Spark”)吗?
    • 使用 Spark 数据帧需要 Spark 模式
    • 另一种方式是使用boto3的s3客户端的select_object_content函数,可以在CSV上运行SQL查询
    • 谢谢。使用 Spark 类型对我来说不是问题,但我想要一个具有成本效益的解决方案。 “Python Shell”类型便宜得多。我的问题是关于 Python Shell。
    • 当然,你可以在glue python shell上使用boto3,在带有s3客户端(boto3)的csv上使用sql
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2019-07-21
    • 2020-06-27
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多