SparkDataFrame 將多行資料平鋪展開

2021-08-28 11:27:54 字數 1297 閱讀 1100

場景如下,某個user_id在不用的月份在id1~id_12上都有資料,機器學習訓練時,這些id對應不同月份上的資料要麼在一起進行編碼,最終成為一行資料,要麼把這些id對應不同月份的資料展開,成為新的feature,比如id1在201805上的資料可以作為乙個新的feature–>201805_id1

變成如下的形式(每個id在不同月份的值變成了新id)

user_id

201703.0_id1

201307.0_id1

201306.0_id

and so on …

def gen_expr(feature_array: array[string]): seq[column] = 

val basic = spark.read.parquet("***")

val expr1 = gen_expr(basic.columns)

val basic_roll =mibasic.groupby("user_id")

.pivot("month")

.agg(expr1.head,expr1.tail:_*)

.na.fill(-1)

主要使用的是spark dataset的pivot函式,先groupby("user_id"),將資料按照user_id進行分組,然後pivot我們需要展開的屬性,比如我們要在month上展開,那麼就要pivot("month"),pivot後要跟agg函式,因為pivot後,對應欄位下會生成一列資料,比如pivot("month")後,如果原始資料中id1在201805有n條資料,那麼pivot後,對應的201805_id1欄位下就會有高度為n的列,在pivot後緊跟的agg函式就要對這些列進行處理,比如使用sum,max,min等等,在這裡我用first取第一行,因為原始資料中每個month下每個id只有一行資料。另外要說明的是,pivot後產生新字段的命名規則是:pivot欄位名_原始id名,比如**中的201805.0_id1

Spark DataFrame中的join型別

spark dataframe中join與sql很像,都有inner join,left join,right join,full join 那麼join方法如何實現不同的join型別呢?看其原型 def join right dataframe,usingcolumns seq string jo...

spark dataframe筆記(鏈結彙總)

spark dataframe筆記 dataframe行轉列 spark dataframe筆記 對dataframe一列值保留4位小數 spark dataframe筆記 按照dataframe某一列的數值排序,並增加一列索引 2 降序排 spark dataframe筆記 按照dataframe...

Spark DataFrame關於資料常用操作

sql語法 1.檢視全表資料 dataframe.show 2.檢視部分字段資料 有4種方法 1 dataframe.select 欄位名稱 show 2 dataframe.select 欄位名稱 show 推薦 3 dataframe.select col 欄位名稱 show 4 datafra...