如何使用spark sql根据json数组的大小查询json数据

时间:2015-06-08 08:22:20

标签: json apache-spark apache-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}
       ]

  } 

我想查询一个有两个以上角色的人吗?如何使用spark sql?

3 个答案:

答案 0 :(得分:0)

您可以使用DataFrame和UserDefinedFunction来实现您想要的效果,如下所示。我试过火花壳。

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

答案 1 :(得分:0)

她是一个简化的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()

答案 2 :(得分:0)

也许 size 正是您所需要的:

<块引用>

size(expr) - 返回数组或映射的大小。

在您的情况下,“角色”大小必须大于 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|
#+--------------------+-----+