簡體   English   中英

Spark scala 從列表中選擇多列和單列

[英]Spark scala selecting multiple columns from a list and single columns

我正在嘗試在 dataframe 上執行 select 但我遇到了一些麻煩。

我有這個初始 dataframe

+----------+-------+-------+-------+
|id|value_a|value_b|value_c|value_d|
+----------+-------+-------+-------+

而我要做的是將 value_a 與 value_b 相加並保持其他相同。 所以我有這個清單

val select_list = List(id, value_c, value_d)

然后我做 select

df.select(select_list.map(col):_*, (col(value_a) + col(value_b)).as("value_b"))

我期待得到這個:

+----------+-------+-------+
|id|value_c|value_d|value_b|  --- that value_b is the sum of value_a and value_b (original)
+----------+-------+-------+

但我得到“這里允許沒有 _* 注釋”。 請記住,實際上我有很多列,所以我需要使用一個列表,我不能簡單地 select 每一列。 我遇到了這個麻煩,因為作為 sum 的結果的新列與現有列具有相同的名稱,所以我不能只 select(column("*"), sum....).drop (value_b) 或者我將刪除舊列和帶有總和的新列。

在單個 select 中添加多個和單個列的正確語法是什么,或者我還能如何解決這個問題? 現在我決定這樣做:

df.select(col("*"), (col(value_a) + col(value_b)).as("value_b_tmp")).
drop("value_a", "value_b").withColumnRenamed("value_b_tmp", "value_b")

哪個工作正常,但我知道 withColumn 和 withColumnRenamed 很昂貴,因為我正在創建一個新的 dataframe 並帶有一個新的或重命名的列,並且我正在尋找成本更低的操作。

提前致謝!

只需使用.withColumn function,它將替換列(如果存在):

df
  .withColumn("value_b", col("value_a") + col("value_b"))
  .select(select_list.map(col):_*)

您可以創建一個新的總和字段並收集 n 列總和的運算結果,如下所示:

 val df: DataFrame = 
 spark.createDataFrame(
    spark.sparkContext.parallelize(Seq(Row(1,2,3),Row(1,2,3))),
       StructType(List(
        StructField("field1", IntegerType), 
        StructField("field2", IntegerType), 
        StructField("field3", IntegerType))))

val columnsToSum = df.schema.fieldNames

columnsToSum.filter(name =>  name != "field1")
  .foldLeft(df.withColumn("sum", lit(0)))((df, column) =>
   df.withColumn("sum", col("sum") + col(column)))

給出:

+------+------+------+---+
|field1|field2|field3|sum|
+------+------+------+---+
|     1|     2|     3|  5|
|     1|     2|     3|  5|
+------+------+------+---+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM