scala—获取spark中(来自配置单元表)列值的平均长度以及数据类型

uqjltbpv  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(691)

任务:获取表的数据类型(在配置单元中)和每列值的平均长度。
我正试图用scala在spark中完成上述任务。首先我做了 val table = spark.sql("desc table") 输出有三列:col\u name、datatype和comment。
然后,我尝试以逗号分隔的字符串形式只获取列值。 val col_string = table.select("col_name").rdd.map(i => "avg(length(trim("+i(0).toString+")))").collect.mkString(", ") 现在,我可以在另一个查询中使用这个字符串来获得下面给出的所有列的平均长度,但是输出dataframe的列数与表的列数一样多,我不知道如何将它与 table Dataframe。 val tbl_length = spark.sql("select " + col_string + " from schema.table") 我已经研究了转置第二个Dataframe,这看起来效率不高,作为spark和scala的初学者很难掌握。
我的上述方法是好的/有效的吗?如果有更好的方法请建议。即使有更好的方法,你也可以解释一下我如何连接两个这样的数据集row=>column。
输入表:
列1 |列2 |列3
交流123 0
定义| 23456 | 0
预期产量
列名称数据类型平均长度
列1 |字符串| 3
列2 | int | 4
列3 | int | 1

bqucvtff

bqucvtff1#

试试这个-

val table = spark.catalog.getTable("df")
    val df = spark.sql(s"select * from ${table.name}")
    df.show(false)
    /**
      * +---+----+
      * |id |name|
      * +---+----+
      * |1  |abc1|
      * |2  |abc2|
      * |3  |abc3|
      * +---+----+
      */
    val aggs = df.columns.map(f => avg(length(trim(col(f)))).as(f))
    val values = df.agg(aggs.head, aggs.tail: _*).head.getValuesMap[Double](df.columns).values.toSeq
    df.schema.map(sf => (sf.name, sf.dataType)).zip(values).map{ case ((name, dt), value) => (name, dt.simpleString, value)}
      .toDF("column_name", "data_type", "avg_length")
      .show(false)

    /**
      * +-----------+---------+----------+
      * |column_name|data_type|avg_length|
      * +-----------+---------+----------+
      * |id         |bigint   |1.0       |
      * |name       |string   |4.0       |
      * +-----------+---------+----------+
      */

相关问题