我正在使用具有自定义 Ubuntu 16.04 AMI 的 EC2 实例。
我正在尝试迁移到使用附加到实例的 IAM 角色来访问 S3。
我创建了一个具有以下权限的简单测试角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
以及以下政策文件:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Run Code Online (Sandbox Code Playgroud)
它已附加到已运行的 EC2 实例。
在 EC2 实例上,我以几种不同的方式测试了 CLI,并且得到了令人惊讶的结果。
ubuntu@machine:~$ aws s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
Run Code Online (Sandbox Code Playgroud)
ubuntu@machine:~$ aws configure list
Name Value Type Location
---- ----- ---- …Run Code Online (Sandbox Code Playgroud) 我最近一直在从事一个项目,该项目涉及使用 Glue 托管服务在 Amazon S3 中抓取数据。这成功地创建了一个 Metastore,我可以在 Glue 控制台上看到它。
我通过控制台手动解决了模式中的错误,例如 STRING --> TIMESTAMP、BIGINT --> STRING 等。一个分区似乎是从 S3 路径中的键自动创建的。即我在 s3 中的对象的键是这样的:
s3://mybucket/YYYMM/object.csv
Glue 通过密钥的 YYYMM(例如 201711)部分成功地对数据进行了分区。
当我运行查询时,我收到以下错误
HIVE_PARTITION_SCHEMA_MISMATCH
这表明虽然表架构已更新,但分区架构尚未更新
查看我发现的文档... https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#schema-syncing
具体来说
有几种方法可以解决此问题。首先,如果数据被意外添加,您可以删除导致架构差异的数据文件,删除分区,并重新抓取数据。其次,您可以删除单个分区,然后在 Athena 中运行 MSCK REPAIR 以使用表的架构重新创建分区。仅当您确信应用的架构将继续正确读取数据时,第二个选项才有效。
所以我尝试了第二个选项并运行。
ALTER TABLE mydb.mytable DROP PARTITION (partition_0=201711), PARTITION (partition_0=201712)
MSCK REPAIR TABLE mydb.mytable
Run Code Online (Sandbox Code Playgroud)
删除分区似乎是成功的,但运行修复表会产生
Partitions not in metastore: mytable:201711 mytable:201712
而且我无法取回任何数据。手动读取分区似乎也不起作用。
例如
ALTER TABLE mydb.mytable ADD
PARTITION (partition_0=201711) LOCATION 's3://bucket/201711',
Run Code Online (Sandbox Code Playgroud)
给出错误 line 2:2: missing 'column' at 'partition' (service: amazonathena; status code: 400; error …
我在胶水作业方面遇到了一些令人沮丧的问题。
我有一个从爬虫创建的表。它检查了一些 CSV 数据并创建了一个架构。需要修改模式的某些元素,例如将数字更改为字符串并应用标头。
我似乎在这里遇到了一些问题 - 某些字段的模式似乎已被选择为双精度。当我尝试将其转换为我需要的字符串时,它包含一些空精度,例如 1234 --> 1234.0。
我的映射代码类似于:
applymapping1 = ApplyMapping.apply(
frame = datasource0,
mappings = [
("col1","double","first_column_name","string"),
("col2","double","second_column_name","string")
],
transformation_ctx = "applymapping1"
)
Run Code Online (Sandbox Code Playgroud)
爬取数据后得到的结果表类似于:
first_column_name second_column_name
1234.0 4321.0
5678.0 8765.0
Run Code Online (Sandbox Code Playgroud)
相对于
first_column_name second_column_name
1234 4321
5678 8765
Run Code Online (Sandbox Code Playgroud)
有没有好的方法来解决这个问题?我尝试将爬虫程序最初创建的表中的模式更改为 bigint 而不是 double,但是当我将映射代码更新为 ("col1","bigint","first_column_name","string" )该表最终会变为空。
嗨,我正在处理一个有点困难的文件格式,我正在尝试对其进行清理以备将来处理。我一直在使用Pyspark将数据处理成数据框。
该文件类似于以下内容:
AA 1234 ZXYW
BB A 890
CC B 321
AA 1234 LMNO
BB D 123
CC E 321
AA 1234 ZXYW
CC E 456
Run Code Online (Sandbox Code Playgroud)
每个“ AA”记录都定义一个或多个逻辑组的开始,并且每一行上的数据都是固定长度的,并且其中包含我要提取的编码信息。至少有20-30种不同的记录类型。每一行的开头始终用两个字母代码标识它们。每个组中可以有1个或许多不同的记录类型(即,并非每个组都存在所有记录类型)
作为第一步,我设法按以下格式将记录分组在一起:
+----------------+---------------------------------+
| index| result|
+----------------+---------------------------------+
| 1|[AA 1234 ZXYV,BB A 890,CC B 321]|
| 2|[AA 1234 LMNO,BB D 123,CC E 321]|
| 3|[AA 1234 ZXYV,CC B 321] |
+----------------+---------------------------------+
Run Code Online (Sandbox Code Playgroud)
第二步,我真的想将数据放入数据框的以下列中:
+----------------+---------------------------------+-------------+--------+--------+
| index| result| AA| BB| CC|
+----------------+---------------------------------+-------------+--------+--------+
| 1|[AA 1234 ZXYV,BB A 890,CC B 321]|AA 1234 ZXYV|BB A 890|CC B …Run Code Online (Sandbox Code Playgroud) aws-glue ×2
amazon-ec2 ×1
amazon-iam ×1
apache-spark ×1
hive ×1
pyspark ×1
python ×1
ubuntu ×1