我目前正在使用 Athena 和Kinesis Firehose, Glue Crawler。Kinesis Firehose正在将 JSON 保存到单行文件,如下所示
{"name": "Jone Doe"}{"name": "Jane Doe"}{"name": "Jack Doe"}
Run Code Online (Sandbox Code Playgroud)
但是我注意到 athena 查询select count(*) from db.names 返回 1 而不是 3。在搜索问题之后。我找到了以下文件。
文章说 JSON 文件文件应该用新行存储。
{"name": "Jone Doe"}
{"name": "Jane Doe"}
{"name": "Jack Doe"}
Run Code Online (Sandbox Code Playgroud)
是否有一些聪明的技巧可以在单行 JSON 文件上运行 athena 查询?
感谢@Constantine,AWS Athena 正在执行分布式处理。由于单行 JSON 文件没有分隔符,因此无法执行分布式处理。因此,您必须在保存文件之前对其进行转换。
Kinesis Firehose 提供使用 Lambda 的转换,我添加了以下转换,以便从 AWS Athena 查询数据。
?const addNewLine = (data) => {
const parsedData = JSON.parse(new Buffer.from(data,'base64').toString('utf8'));
return new Buffer.from(JSON.stringify(parsedData) + '\n').toString('base64') …Run Code Online (Sandbox Code Playgroud) 我曾经知道i <= N和之间没有区别i < N+1
但是,当我进入6 6程序时.
如果i <= N那么它打印
1 6 6
6 1 1
2 3 3
3 2 2
除此以外
1 6 6
6 1 1
2 3 3
3 2 2
3 2 2
2 3 3
我无法弄清楚它为何会有所作为
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LNT;
LNT gcd(LNT a, LNT b)
{
if( b == 0)
return a;
return gcd(b, a%b);
}
int main()
{
LNT …Run Code Online (Sandbox Code Playgroud) 我学过C++,Java,现在我正在学习Ruby.
但对我而言,很难适应ruby中的迭代.
n = 4
arys = Array.new(3, Array.new(n+1, 0))
for i in 1..2
for j in 1..n
arys[i][j] = (i-1)*n+j
end
end
p arys
Run Code Online (Sandbox Code Playgroud)
上述代码的输出如下
Run Code Online (Sandbox Code Playgroud)[[0, 5, 6, 7, 8], [0, 5, 6, 7, 8], [0, 5, 6, 7, 8]]
我认为这就像C中的代码一样
for(int i = 1; i<=2; i++)
for(int j = 1; j<=n; j++)
arys[i][j] = (i-1)*n+j
Run Code Online (Sandbox Code Playgroud)
因此,我预计输出会像
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 5, 6, 7, 8]]
上面两个代码之间的区别是什么?