如何使用 Spark SQL 根据 JSON 数组的大小查询 JSON 数据?

How to query JSON data according to JSON array's size with Spark SQL?

我有一个 JSON 这样的:

{
     "uin":10000,
     "role":[
             {"role_id":1, "role_level": 10},
             {"role_id":2, "role_level": 1}
         ]
}
{     "uin":10001,
       "role":[
             {"role_id":1, "role_level": 1}, 
             {"role_id":2, "role_level": 1},
             {"role_id":3, "role_level": 1},
             {"role_id":4, "role_level": 20}
       ]

  } 

我想查询一个具有两个以上角色的uin。我如何使用 Spark SQL?

你可以使用DataFrame和UserDefinedFunction来实现你想要的,如下图。我试过 spark-shell。

val jsonRdd = sc.parallelize(Seq("""{"uin":10000,"role":[{"role_id":1, "role_level": 10},{"role_id":2, "role_level": 1}]}"""))
val df = sqlContext.jsonRDD(jsonRdd)
val predict = udf((array: Seq[Any]) => if (array.length > 2) true else false)
val df1 = df.where( predict(df("role")) )
df1.show

她是一个简化的python版本

r1 = ssc.jsonFile("role.json").select("uin","role.role_id")
r1.show()

slen = udf(lambda s: len(s), IntegerType())
r2 = r1.select(r1.uin,r1.role_id,slen(r1.role_id).alias("slen"))
res = r2.filter(r2.slen>1)
res.show()

也许size就是您所需要的:

size(expr) - Returns the size of an array or a map.

在您的情况下,“角色”大小必须大于 2。

如果你有这个JSON:

json = \
[
  {
    "uin":10000,
    "role":[
      {"role_id":1, "role_level": 10},
      {"role_id":2, "role_level": 1}
    ]
  },
  {
    "uin":10001,
    "role":[
      {"role_id":1, "role_level": 1}, 
      {"role_id":2, "role_level": 1},
      {"role_id":3, "role_level": 1},
      {"role_id":4, "role_level": 20}
    ]
  }
]

你可以使用这个:

from pyspark.sql import functions as F
rdd = spark.sparkContext.parallelize([json])
df = spark.read.json(rdd)

df = df.filter(F.size('role') > 2)

df.show()
#+--------------------+-----+
#|                role|  uin|
#+--------------------+-----+
#|[{1, 1}, {2, 1}, ...|10001|
#+--------------------+-----+