在AWS Glue Python Shell中查询Athena表
Python外壳作业是在AWS Glue中引入的。他们提到: 例如,您现在可以使用PythonShell作业将SQL查询提交到以下服务:。。。亚马逊雅典娜 嗯。我们有一个从Athena表读取数据的示例: 但是,它使用Spark而不是pythonshell。Spark作业类型通常不提供此类库,我有一个错误: ModuleNotFoundError:没有名为“awsglue.transforms”的模块在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 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格式的,或者我已经记不清实现细节了。