【问题标题】:Retrieve and format data from HBase to scala Dataframe从 HBase 检索和格式化数据到 scala Dataframe
【发布时间】:2019-04-27 17:29:32
【问题描述】:

我正在尝试将数据从 hbase 表获取到 apache spark 环境中,但我无法弄清楚如何格式化它。谁能帮帮我。

case class systems( rowkey: String, iacp: Option[String], temp: Option[String])

type Record = (String, Option[String], Option[String])

val hBaseRDD_iacp = sc.hbaseTable[Record]("test_table").select("iacp","temp").inColumnFamily("test_fam") 

scala> hBaseRDD_iacp.map(x => systems(x._1,x._2,x._3)).toDF().show()
+--------------+-----------------+--------------------+
|        rowkey|             iacp|                temp|
+--------------+-----------------+--------------------+
|           ab7|0.051,0.052,0.055| 17.326,17.344,17.21|
|           k6c|   0.056,NA,0.054|17.277,17.283,17.256|
|            ad|          NA,23.0|           24.0,23.6|
+--------------+-----------------+--------------------+

但是,我实际上希望它采用以下格式。每个逗号分隔的值都在新行中,每个 NA 都被 null 值替换。 iacp 和 temp 列中的值应为浮点类型。每行可以有不同数量的逗号分隔值。

提前致谢!

+--------------+-----------------+--------------------+
|        rowkey|             iacp|                temp|
+--------------+-----------------+--------------------+
|           ab7|            0.051|              17.326|
|           ab7|            0.052|              17.344|
|           ab7|            0.055|               17.21|
|           k6c|            0.056|              17.277|
|           k6c|             null|              17.283|
|           k6c|            0.054|              17.256|
|            ad|             null|                24.0|
|            ad|               23|                26.0|
+--------------+-----------------+--------------------+

【问题讨论】:

    标签: scala apache-spark apache-spark-sql hbase


    【解决方案1】:

    您的 hBaseRDD_iacp.map(x => systems(x._1, x._2, x._3)).toDF 代码行应生成一个等效于以下内容的 DataFrame:

    val df = Seq(
      ("ab7", Some("0.051,0.052,0.055"), Some("17.326,17.344,17.21")),
      ("k6c", Some("0.056,NA,0.054"), Some("17.277,17.283,17.256")),
      ("ad", Some("NA,23.0"), Some("24.0,23.6"))
    ).toDF("rowkey", "iacp", "temp")
    

    要将数据集转换为想要的结果,您可以应用一个 UDF,将 iacptemp CSV 字符串的元素配对以生成 (Option[Double], Option[Double]) 数组,然后是 explode-ed,如如下图:

    import org.apache.spark.sql.functions._
    import spark.implicits._
    
    def pairUpCSV = udf{ (s1: String, s2: String) =>
      import scala.util.Try
      def toNumericArr(csv: String) = csv.split(",").map{
        case s if Try(s.toDouble).isSuccess => Some(s)
        case _ => None
      }
      toNumericArr(s1).zipAll(toNumericArr(s2), None, None)
    }
    
    df.
      withColumn("csv_pairs", pairUpCSV($"iacp", $"temp")).
      withColumn("csv_pair", explode($"csv_pairs")).
      select($"rowkey", $"csv_pair._1".as("iacp"), $"csv_pair._2".as("temp")).
      show(false)
    // +------+-----+------+
    // |rowkey|iacp |temp  |
    // +------+-----+------+
    // |ab7   |0.051|17.326|
    // |ab7   |0.052|17.344|
    // |ab7   |0.055|17.21 |
    // |k6c   |0.056|17.277|
    // |k6c   |null |17.283|
    // |k6c   |0.054|17.256|
    // |ad    |null |24.0  |
    // |ad    |23.0 |23.6  |
    // +------+-----+------+
    

    请注意,值NA 属于方法toNumericArr 中的默认情况,因此不单独作为单独的情况。此外,在 UDF 中使用zipAll(而不是zip)来涵盖iacptemp CSV 字符串具有不同元素大小的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多