我如何展平hbase单元格,以便我可以使用Scala中的Spark RDD或Data框架处理生成的JSON?

时间:2016-05-03 13:55:30

标签: json scala apache-spark hbase spark-dataframe

这里是spark,hbase和scala的相对新手。 我在同一列系列的hbase单元格中有json(存储为字节数组),但是有几千个列限定符。示例(简化):

  

表名:'活动'

     

rowkey:rk1   专栏系列:cf1

     

列限定符:cq1,单元格数据(以字节为单位):{" id":1," event":" stand"}

     

列限定符:cq2,单元格数据(以字节为单位):{" id":2," event":" sit"}

使用scala,我可以通过指定时间范围来读取行

  val scan = new Scan()
  val start = 1460542400
  val end = 1462801600
  val hbaseContext = new HBaseContext(sc, conf)
  val getRdd = hbaseContext.hbaseRDD(TableName.valueOf("Events"), scan)

如果我尝试将hbase rdd(getRdd)加载到数据帧中(在将字节数组转换为字符串等之后),它只读取每行中的第一个单元格(在上面的示例中,我只会得到& #34;站立"。

  

此代码仅为返回的每一行加载一个单元格

  val resultsString = getRdd.map(s=>Bytes.toString(s._2.value()))
  val resultsDf = sqlContext.read.json(resultsString)

为了获得每个单元格,我必须迭代如下。

    val jsonRDD = getRdd.map(
    row => {
      val str = new StringBuilder
      str.append("[")
      val it = row._2.listCells().iterator()
      while (it.hasNext) {
        val cell = it.next()
        val cellstring = Bytes.toString(CellUtil.cloneValue(cell))
        str.append(cellstring)
        if (it.hasNext()) {
          str.append(",")
        }
      }
      str.append("]")
      str.toString()
    }
  )
  val hbaseDataSet = sqlContext.read.json(jsonRDD)

我需要添加方括号和逗号,以便为数据帧正确格式化json以读取它。

问题:

  1. 是否有更优雅的方法来构造json,即一些解析器接收单个json字符串并将它们连接在一起,以便正确形成json?
  2. 是否有更好的能力来展平hbase细胞,所以我不需要迭代?
  3. 对于jsonRdd,计算的闭包应该包含str局部变量,因此在节点上执行此代码的任务不应该缺少" [","]&# 34;或","。也就是说,一旦我在集群上运行它而不是本地[*]
  4. ,我就不会得到解析器错误
  5. 最后,最好是从json创建一对RDD还是使用数据帧执行简单的事情,比如计数?有没有办法衡量一个与另一个的效率和性能?
  6. 谢谢

0 个答案:

没有答案