如何将 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 的选定列移动到它的末尾(重新排列列位置)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不从 DataFrame 转换并访问它的情况下将列添加到 Dataset?