我有一个看起来像这样的表:
CREATE TABLE tracks (id SERIAL, artists JSON);
INSERT INTO tracks (id, artists)
VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists)
VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)
还有其他几个与此问题无关的列.将它们存储为JSON是有原因的.
我要做的是查找具有特定艺术家姓名(完全匹配)的曲目.
我正在使用此查询:
SELECT * FROM tracks
WHERE 'ARTIST NAME' IN
(SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)
例如
SELECT * FROM tracks
WHERE 'The Dirty Heads' IN
(SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)
但是,这会进行全表扫描,并且速度不是很快.我尝试使用函数创建GIN索引names_as_array(artists)并使用'ARTIST NAME' = ANY names_as_array(artists),但是不使用索引并且查询实际上明显更慢.
这是我的表格(简化的,只有重要的列):
CREATE TABLE things (
id serial primary key
, name varchar
, blueprint json default '{}'
);
Run Code Online (Sandbox Code Playgroud)
以及一些示例数据:
# select * from things;
id | name | blueprint
----+---------+-----------------------------------------------------------------------------
1 | Thing 1 | {}
2 | Thing 2 | {"1":{"name":"Iskapola","wight":"2"}}
3 | Thing 3 | {"1":{"name":"Azamund","weight":"3"}, "2":{"name":"Iskapola","weight":"1"}}
4 | Thing 4 | {"1":{"name":"Ulamir","weight":"1"}, "2":{"name":"Azamund","weight":"1"}}
Run Code Online (Sandbox Code Playgroud)
我想选择键'Azamund'下任意位置的行name。像这样的东西:
# select * from things where * ->> 'name' = 'Azamund';
id | blueprint
----+----------------------------------------------------------------------------
7 | {"1":{"name":"Azamund","weight":"3"}, "2":{"name":"Iskapola","weight":"1"}} …Run Code Online (Sandbox Code Playgroud) 我正在尝试以不同的方式查询记录数组中的记录并将完整的Row显示为输出。
我不知道哪个嵌套对象具有字符串“ pg”。但是我想查询特定的对象。对象是否具有“ pg”。如果“ pg”存在,那么我想显示该完整行。如何在不指定对象索引的情况下在嵌套对象上写“ spark sql query”。所以我不想使用children.name的索引
我的Avro记录:
{
"name": "Parent",
"type":"record",
"fields":[
{"name": "firstname", "type": "string"},
{
"name":"children",
"type":{
"type": "array",
"items":{
"name":"child",
"type":"record",
"fields":[
{"name":"name", "type":"string"}
]
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Spark SQL上下文查询读取的数据框。所以如果输入是
Row no Firstname Children.name
1 John Max
Pg
2 Bru huna
aman
Run Code Online (Sandbox Code Playgroud)
输出应该返回poq 1,因为它有一行,其中childs.name的一个对象是pg。
val results = sqlc.sql("SELECT firstname, children.name FROM nestedread where children.name = 'pg'")
results.foreach(x=> println(x(0), x(1).toString))
Run Code Online (Sandbox Code Playgroud)
上面的查询不起作用。但是当我查询children [1] .name时,它可以工作。
我也想知道,如果我可以过滤一组记录然后爆炸。而不是先爆炸并创建大量行,然后进行过滤。
hiveql apache-spark parquet apache-spark-sql spark-dataframe
json ×2
postgresql ×2
sql ×2
apache-spark ×1
hiveql ×1
indexing ×1
jsonb ×1
nested ×1
parquet ×1