我正在尝试创建一个工作流程,其中 AWS Glue ETL 作业将从外部 REST API(而不是 S3 或任何其他 AWS 内部源)提取 JSON 数据。这可能吗?有人做吗?请帮忙!
我使用 awsglue 爬取数据,从 s3 文件夹导入 json 数据,该文件夹包含根大括号是如下数组的数据:
[{id: '1', name: 'rick'},{id: '2', name: 'morty'}]
Run Code Online (Sandbox Code Playgroud)
这最终会产生这样的模式:
array<struct<expand:string,id:string,name:string>>
Run Code Online (Sandbox Code Playgroud)
如何name
在 Athena 中查询?
如果我尝试这个:
SELECT * FROM people_s3_buckets WHERE name = "rick";
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
SYNTAX_ERROR: Column 'name' cannot be resolved
Run Code Online (Sandbox Code Playgroud)
也许,有一种方法可以设置 Glue 爬虫以仅添加数组中的元素并避免完全嵌套?
每次我对现有数据运行胶水爬虫时,它都会将 Serde 序列化库更改为LazySimpleSerDe
,这不能正确分类(例如,对于带逗号的引用字段)
然后,我需要手动编辑 Glue Catalog 中的表格详细信息,将其更改为org.apache.hadoop.hive.serde2.OpenCSVSerde
.
我尝试制作自己的 csv 分类器,但这没有帮助。
如何让爬虫为生成或更新的表指定特定的序列化库?
amazon-web-services amazon-athena aws-glue aws-glue-data-catalog
我有一个带有 Spark(v2.2.1) 的 AWS EMR 集群 (v5.11.1),并尝试使用 AWS Glue 数据目录作为其元存储。根据官方 AWS 文档(下面的参考链接)中提供的指南,我已按照这些步骤操作,但在访问 Glue 目录数据库/表时遇到了一些差异。EMR 集群和 AWS Glue 都在同一个账户中,并提供了适当的 IAM 权限。
AWS 文档:https : //docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html
观察:
- 使用 spark-shell(来自 EMR 主节点):
- 作品。能够使用以下命令访问 Glue DB/Tables:
Run Code Online (Sandbox Code Playgroud)spark.catalog.setCurrentDatabase("test_db") spark.catalog.listTables
- 使用 spark-submit(来自 EMR 步骤):
- 不起作用。不断收到错误“数据库'test_db'不存在”
错误跟踪如下:
INFO HiveClientImpl:Hive 客户端(版本 1.2.1)的仓库位置是 hdfs:///user/spark/warehouse
INFO HiveMetaStore: 0: get_database: 默认
INFO audit: ugi=hadoop ip=unknown-ip-addr cmd=get_database:默认
信息 HiveMetaStore:0:get_database:global_temp
信息审计:ugi=hadoop ip=unknown-ip-addr cmd=get_database:global_temp
WARN ObjectStore:无法获取数据库 global_temp,返回 NoSuchObjectException
INFO SessionState:创建的本地目录:/mnt3/yarn/ usercache / Hadoop的/应用程序缓存/ application_1547055968446_0005 / container_1547055968446_0005_01_000001的/ …
amazon-emr apache-spark aws-glue hive-metastore aws-glue-data-catalog
我正在尝试使用 hive 在 EMR 中运行的 Spark 中使用来自 Spark 的 s3 路径位置在 Glue 目录中创建一个表。我已尝试以下命令,但出现错误:
pyspark.sql.utils.AnalysisException:u'java.lang.IllegalArgumentException:无法从空字符串创建路径;'
sparksession.sql("CREATE TABLE IF NOT EXISTS abc LOCATION 's3://my-bucket/test/' as (SELECT * from my_table)")
sparksession.sql("CREATE TABLE abcSTORED AS PARQUET LOCATION 's3://my-bucket/test/' AS select * from my_table")
sparksession.sql("CREATE TABLE abcas SELECT * from my_table USING PARQUET LOCATION 's3://my-bucket/test/'")
有人可以建议我缺少的参数吗?
hive amazon-web-services pyspark aws-glue-data-catalog aws-glue-spark
已搜索 AWS Glue 文档,但找不到 AWS Glue 工作线程类型 G.1X 和 G.2X 的定价详细信息。有人可以解释一下标准、G.1X 和 G.2X 之间是否没有成本差异吗?
我所能看到的 Glue 定价部分是“您需要按每 DPU 小时 0.44 美元计费,增量为 1 秒,四舍五入到最接近的秒。使用 Glue 版本 2.0 的 Glue Spark 作业的最短计费持续时间为 1 分钟。 ”。这与工人类型无关吗?
标准类型 - 16 GB 内存、4 个 vCPU 计算能力和 50 GB 附加 EBS 存储(2 个执行程序)
G.1X - 16 GB 内存、4 个 vCPU 和 64 GB 附加 EBS 存储(1 个执行程序)
G.2X - G.1X 的两倍 ( https://aws.amazon.com/blogs/big-data/best-practices-to-scale-apache-spark-jobs-and-partition-data-with-aws -glue/ ) 这意味着,
G.2X - 32 GB 内存、8vCPU、128 GB EBS !!
感谢对此的任何投入。 …
amazon-web-services aws-glue aws-glue-data-catalog aws-glue-spark
我在 S3 上对 CSV 文件中的数据进行了分区:
我在 s3://bucket/dataset/ 上运行一个分类器,结果看起来非常有希望,因为它检测到 150 列 (c1,...,c150) 并分配了各种数据类型。
在 Athena 中加载结果表并查询 ( select * from dataset limit 10
) 它会产生错误消息:
HIVE_PARTITION_SCHEMA_MISMATCH:表和分区模式之间存在不匹配。类型不兼容,不能强制。表 'tests.dataset' 中的列 'c100' 被声明为类型 'string',但分区 'AANtbd7L1ajIwMTkwOQ' 将列 'c100' 声明为类型 'boolean'。
首先,我不知道如何使用“AANtbd7L1ajIwMTkwOQ”……但我可以从 Glue 中的分区列表中看出,有些分区将 c100 归类为字符串,而另一些则归类为布尔值。而表模式将其列为字符串。
这也意味着,如果我将查询限制为将 c100 分类为与表模式一致的字符串的分区,那么该查询将起作用。如果我使用将 c100 分类为布尔值的分区,则查询将失败并显示上述错误消息。
现在通过查看一些 CSV 列 c100 似乎包含三个不同的值:
可能某些行包含拼写错误(可能),因此某些分区被归类为字符串 - 但这只是一个理论,并且由于文件的数量和大小而难以验证。
我也试过MSCK REPAIR TABLE dataset
没有用。
有没有快速解决方案?也许强制所有分区使用字符串?如果我查看分区列表,则有一个已停用的“编辑架构”按钮。
或者我是否必须编写一个 Glue 作业来检查和丢弃或修复每一行?
我对应该如何使用terraform将Athena连接到我的Glue Catalog数据库感到困惑。
我用
resource "aws_glue_catalog_database" "catalog_database" {
name = "${var.glue_db_name}"
}
resource "aws_glue_crawler" "datalake_crawler" {
database_name = "${var.glue_db_name}"
name = "${var.crawler_name}"
role = "${aws_iam_role.crawler_iam_role.name}"
description = "${var.crawler_description}"
table_prefix = "${var.table_prefix}"
schedule = "${var.schedule}"
s3_target {
path = "s3://${var.data_bucket_name[0]}"
}
s3_target {
path = "s3://${var.data_bucket_name[1]}"
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个Glue数据库,然后使用搜寻器来爬行s3存储桶(这里只有两个),但是我不知道如何将Athena查询服务链接到Glue DB。在的terraform文档中Athena
,似乎没有一种方法可以将Athena连接到Glue目录,而只能连接到S3存储桶。但是,显然,雅典娜可以与Glue集成在一起。
如何构建Athena数据库以使用我的Glue目录作为数据源而不是S3存储桶?
amazon-web-services terraform aws-glue terraform-provider-aws aws-glue-data-catalog
我正在设置一个新的爬网程序,该爬网程序按计划执行,但由于内部有逗号的双引号而失败
我搜索并发现 OpenCSVSerDe lib 用于编辑表详细信息,但我正在创建新表,我想知道如何添加一些配置以允许爬虫正确生成数据目录
如果 csv 文件具有像"$3.62","4,406"
数据目录那样的价值
col0 col1
"$3.62" "4,406"
Run Code Online (Sandbox Code Playgroud)
但我得到:
col0 col1 col2
"$3.62" "4 406"
Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-athena aws-glue aws-glue-data-catalog
我阅读了 Glue 目录表,将其转换为数据帧并使用下面的内容打印模式(使用 Python 的 Spark)
dyf = glueContext.create_dynamic_frame.from_catalog(database='database_name',
table_name='table_name',
redshift_tmp_dir=args['TempDir'])
df = dyf.toDF()
df.printschema()
Run Code Online (Sandbox Code Playgroud)
当表有数据时它工作正常。
但是,如果表为空,它不会打印架构(它无法获取空表的架构)。结果,未来的连接失败。
有没有办法克服这个问题,并使动态框架从目录中获取表模式,即使对于空表或任何其他替代方案也是如此?