構成可能な列名を持つデータフレームがあります。
Journey channelA channelB channelC
j1 1 0 0
j1 0 1 0
j1 1 0 0
j2 0 0 1
j2 0 1 0
構成可能ということは、データフレームに「n」チャネルがある可能性があることを意味します。
今、私はすべてのチャネルの合計を次のようなものにする必要がある変換が必要です
df.groupBy("Journey").agg(sum("channelA"), sum("channelB"), sum("channelC"))
その出力は次のようになります:
Journey sum(channelA) sum(channelB) sum(channelC)
j1 2 1 0
j2 0 1 1
次に、列名を元の名前に変更したいと思います。
.withColumnRenamed("sum(channelA)", channelA)
しかし、前述のようにチャネルリストは構成可能であり、総称列の名前変更ステートメントですべての合計列の名前を元の列名に変更して、期待されるデータフレームを次のように取得します。
Journey channelA channelB channelC
j1 2 1 0
j2 0 1 1
これにアプローチする方法の提案
DataFrameの列の名前を動的に変更するには、メソッドtoDF(scala.collection.Seq colNames)を使用できます。この場合、元の列名を動的に入力できますcolNames。
したがって、次のようなシーケンスを動的に入力できます。
val columnsRenamed = Seq("Journey", "channelA", "channelB","channelC")
次に、メソッドtoDFを呼び出します。
df = df.toDF(columnsRenamed: _*)
: _*
演算子の理由は、フォームSeq[String]
をString*
にキャストするためです。
また、次の方法で名前を変更することもできます。入力dfの形式が、列_1、_2のinputDf:DataFrameであるとします。
val newDf = inputDf.selectExpr("_1 as x1", "_2 as X2")
* as -> maps to alias
その他の詳細な回答はここにあります:データフレームの列名の名前変更spark scala