Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AWS Glue Python Shell中查询Athena表_Python_Amazon Web Services_Aws Glue - Fatal编程技术网

在AWS Glue Python Shell中查询Athena表

在AWS Glue Python Shell中查询Athena表,python,amazon-web-services,aws-glue,Python,Amazon Web Services,Aws Glue,Python外壳作业是在AWS Glue中引入的。他们提到: 例如,您现在可以使用PythonShell作业将SQL查询提交到以下服务:。。。亚马逊雅典娜 嗯。我们有一个从Athena表读取数据的示例: 但是,它使用Spark而不是pythonshell。Spark作业类型通常不提供此类库,我有一个错误: ModuleNotFoundError:没有名为“awsglue.transforms”的模块 如何重写上述代码以使其在Python Shell作业类型中可执行?我有几个月的时间使用glue,

Python外壳作业是在AWS Glue中引入的。他们提到:

例如,您现在可以使用PythonShell作业将SQL查询提交到以下服务:。。。亚马逊雅典娜

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

但是,它使用Spark而不是pythonshell。Spark作业类型通常不提供此类库,我有一个错误:

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


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

我有几个月的时间使用glue,我使用:

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>)
从pyspark.context导入SparkContext
从awsglue.context导入GlueContext
sc=SparkContext()
glueContext=glueContext(sc)
spark=glueContext.spark\u会话
data\u frame=spark.read.format(“com.databricks.spark.csv”)\
.选项(“标题”、“正确”)\
.load()

我有几个月的时间使用胶水,我使用:

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>)
从pyspark.context导入SparkContext
从awsglue.context导入GlueContext
sc=SparkContext()
glueContext=glueContext(sc)
spark=glueContext.spark\u会话
data\u frame=spark.read.format(“com.databricks.spark.csv”)\
.选项(“标题”、“正确”)\
.load()

问题是,pythonshell类型有自己有限的内置代码集

我只使用查询数据并将其读入数据帧来实现我的目标

以下是代码片段:

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')

问题是,pythonshell类型有它自己有限的一组内置代码

我只使用查询数据并将其读入数据帧来实现我的目标

以下是代码片段:

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')

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

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

参考链接:

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


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

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

    参考链接:

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



    使用我拥有的代码
    ModuleNotFoundError:没有名为'pyspark'的模块
    。你确定你的作业类型是“PythonShell”(不是“Spark”)吗?使用Spark数据框架需要Spark模式。如果使用boto3的s3客户端的
    select\u object\u content
    函数,你可以在CSVS上运行SQL查询。这不是一个问题,我使用火花类型,但我想要一个成本效益的解决方案。“pythonshell”类型要便宜得多。我的问题是关于Python Shell的。当然,您可以在glue Python Shell上使用boto3,在csv和s3客户端上使用sql(boto3),使用我拥有的代码
    ModuleNotFoundError:No module name'pyspark'
    。你确定你的作业类型是“PythonShell”(不是“Spark”)吗?使用Spark数据框架需要Spark模式。如果使用boto3的s3客户端的
    select\u object\u content
    函数,你可以在CSVS上运行SQL查询。这不是一个问题,我使用火花类型,但我想要一个成本效益的解决方案。“pythonshell”类型要便宜得多。我的问题是关于PythonShell的。当然,你可以在glue PythonShell上使用boto3,在csv上使用sql和s3客户端(boto3),你知道这一点吗?我也有同样的问题?我为自己解决了这个问题。请查看我对我刚才发布的问题的回答。你知道这一点吗?我也有同样的问题?我为自己解决了这个问题。请查看我对我刚才发布的问题的回答。您可以将自己的LIB带到python shell作业中,就像这一个,您的回答几乎完全符合我的期望,谢谢!但是,您并没有指定输出文件格式,而是将其读取为CSV,但实际上,它们是TXT。所以熊猫不能用pd.read_csv(obj['Body'])读取它们。有没有强制输出到CSV的选项?@Jérémy,在我的情况下,输出已经是CSV格式的,或者我已经记不清实现的细节了。您可以将自己的LIB带到python shell作业中,像这样您的答案几乎完全符合我的期望,谢谢!但是,您并没有指定输出文件格式,而是将其读取为CSV,但实际上,它们是TXT。所以熊猫不能用pd.read_csv(obj['Body'])读取它们。有没有强制输出到CSV的选项?@Jérémy,在我的例子中,输出已经是CSV格式的,或者我已经记不清实现细节了。