我们遇到这样一个问题,
1 先生成一个包含所有预置字段的DataFrame(此时的字段名称是英文的)

2 根据传入的条件动态组合字段从1中的大的DataFrame 里 select的到想要的字段

3 但是我想存入的csv文件中要有中文表头

4 遇到的问题是:使用sql 拼接然后as 取别名为中文,会报出不支持

所以想到如下的方法来解决:

package ezr.df.drill

import org.apache.spark.sql.{Column, DataFrame, SparkSession}

import scala.collection.mutable
import org.apache.spark.sql.functions._

/**
  * @author liuchangfu@easyretailpro.com
  *         2019/12/24. 
  */
object SplitDfZhongWen{
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .appName("CfItem")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()

    import spark.implicits._
    /**第一步:的到所有字段的DataFrame*/
    val df: DataFrame = Seq(
      ("1001", "张三", 50),
      ("1002", "李四", 20),
      ("1003", "王五", 30),
      ("1004", "马六", 70),
      ("1005", "赵四", 20),
      ("1006", "刘五", 30),
      ("1007", "陈六", 70),
      ("1008", "朱四", 20),
      ("1009", "杨五", 30),
      ("1010", "吴六", 70),
      ("1011", "严四", 20),
      ("1012", "马五", 30),
      ("1013", "赵六", 70)
    ).map(r=>(r._1,r._2,new Integer(r._3)))
      .toDF("id","name","age")
    /**第二步:准备英文中文对照字典表,放map里*/
     val map: mutable.Map[String, String] = mutable.Map("id"->"编号","name"->"名字","age"->"年龄")
    /**第三步:计算结果注册成一个临时表*/
    df.createTempView("my_table_test")
    /**第四步:我的动态拼接的字段和sql*/
    val mySql = "select id,name from my_table_test"
    /**第六步:可以写入csv文件的所有需要的字段和值*/
    val englishColumnsDF = spark.sql(mySql)
    //看一下应为show的结果和下面对比
    englishColumnsDF.show()
    /**第七步:调用我自己定义的多列重命名方法,把应为列名转换成中文列名*/
    val chineseColumnsDF = columnNamesRename(englishColumnsDF,map)
    chineseColumnsDF.show()

  }

  /**
    * 多列同时重命名
    * @param df 传入要重命名的DataFrame
    * @param map 传入预先准备好的英文中文对照字典表
    * @return 返回重新命名后的DataFrame
    */
  def columnNamesRename(df:DataFrame,map: mutable.Map[String, String]) ={
    val oldColumnNames: Seq[String] = df.columns.toSeq
    val renamedColumns: Seq[Column] = oldColumnNames.map(name =>{
      val newName = map.get(name).getOrElse("")
      col(name).as(newName)
    })
    df.select(renamedColumns : _*)
  }
}

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐