相关疑难解决方法(0)

用于在JSON数组中查找元素的索引

我有一个看起来像这样的表:

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),但是不使用索引并且查询实际上明显更慢.

sql postgresql indexing json jsonb

74
推荐指数
1
解决办法
5万
查看次数

如何过滤json列中嵌套值的行?

这是我的表格(简化的,只有重要的列):

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)

sql postgresql json nested

5
推荐指数
1
解决办法
6356
查看次数

查询实木复合地板记录中的嵌套数组

我正在尝试以不同的方式查询记录数组中的记录并将完整的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

2
推荐指数
1
解决办法
3395
查看次数