【问题标题】:How to query JSON data according to JSON array's size with Spark SQL?如何使用 Spark SQL 根据 JSON 数组的大小查询 JSON 数据?
【发布时间】:2015-08-22 15:10:46
【问题描述】:

我有一个这样的 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 来做到这一点?

【问题讨论】:

    标签: json apache-spark apache-spark-sql


    【解决方案1】:

    你可以使用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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        也许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|
        #+--------------------+-----+
        

        【讨论】:

          猜你喜欢
          • 2016-03-31
          • 1970-01-01
          • 2014-10-03
          • 1970-01-01
          • 2023-03-29
          相关资源
          最近更新 更多