我有一个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?
答案 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|
#+--------------------+-----+