如何将 DataFrame 的选定列移动到它的末尾(重新排列列位置)? [复制]

Posted

技术标签:

【中文标题】如何将 DataFrame 的选定列移动到它的末尾(重新排列列位置)? [复制]【英文标题】:How to move selected columns of a DataFrame to the end of it (re arranging the column positions)? [duplicate] 【发布时间】:2018-08-06 15:10:38 【问题描述】:

我正在尝试将 RDBMS (Greenplum) 表引入 Hive。我阅读了表格并从中获取了一个数据框,如下所示:

val yearDF = spark.read.format("jdbc").option("url", connectionUrl)
                                                   .option("dbtable", "(select * from schema.table where source_system_name='DB2' and period_year='2017') as year2017")
                                                   .option("user", devUserName)
                                                   .option("password", devPassword)
                                                   .option("numPartitions",15)
                                                   .load()

上述DF的schema是:

forecast_id:bigint
period_year:numeric(15,0)
period_num:numeric(15,0)
period_name:character varying(15)
source_system_name:character varying(30)
source_record_type:character varying(30)
ptd_balance:numeric
xx_data_hash_id:bigint
xx_pk_id:bigint

为了将上述数据帧提取到 hive 中,我将架构放入列表中,并将所有 greenplum 数据类型更改为 hive 兼容数据类型。 我有一张地图:dataMapper,它告诉我们应该将什么数据类型的 gp 转换成 Hive 的

class ChangeDataTypes(val gpColumnDetails: List[String], val dataMapper: Map[String, String]) 
  val dataMap: Map[String, String] = dataMapper
  def gpDetails(): String = 
    val hiveDataTypes = gpColumnDetails.map(_.split(":\\s*")).map(s => s(0) + " " + dMap(s(1))).mkString(",")
    hiveDataTypes
  
  def dMap(gpColType: String): String = 
    val patterns = dataMap.keySet
    val mkey = patterns.dropWhile
      p => gpColType != p.r.findFirstIn(gpColType).getOrElse("")
    .headOption match 
      case Some(p) => p
      case None => ""
    
    dataMap.getOrElse(mkey, "n/a")
  

这些是上述代码执行后的数据类型:

forecast_id:bigint
period_year:bigint
period_num:bigint
period_name:String
source_system_name:String
source_record_type:String
ptd_balance:double
xx_data_hash_id:bigint
xx_pk_id:bigint

由于我的 Hive 表是基于 source_system_name 和 period_year 动态分区的,我需要通过移动列数据来更改数据框的内容:source_system_name & period_year 到数据框的末尾,因为 Hive 表的分区列应该是插入数据时动态分区的表的最后一个。

谁能告诉我如何移动列:source_system_name & period_year of the dataframe: yearDF 从当前位置到末尾(基本上是重新排列列)?

【问题讨论】:

【参考方案1】:

从主列表中提取列,然后在末尾追加并在 DataFrame 上执行选择:

val lastCols = Seq("col1","col2")
val allColOrdered = df.columns.diff(lastCols) ++ lastCols
val allCols = allColOrdered.map(cn => org.apache.spark.sql.functions.col(cn))
val result = df.select(allCols: _*)

【讨论】:

它工作..非常感谢..

以上是关于如何将 DataFrame 的选定列移动到它的末尾(重新排列列位置)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在python中将所有零移动到数组的末尾

按周python迭代带有日期列的pd df

如何在不从 DataFrame 转换并访问它的情况下将列添加到 Dataset?

我可以将 repo 的 .git 目录移动到它的父目录吗?

如何将选定列和行中的DataGridView值插入ListView?

如何在 iOS 中将选定的背景视图添加到 iCarousel?