Суммирование n столбцов в Spark в Java с использованием фреймов данных - PullRequest
0 голосов
/ 09 мая 2018
String[] col = {"a","b","c"}

Данные:

id a b c d e 
101 1 1 1 1 1
102 2 2 2 2 2
103 3 3 3 3 3

Ожидаемый результат: - идентификатор с суммой столбцов, указанных в строке столбца

id (a+b+c)
101 3
102 6
103 9

Как это сделать с помощью фреймов данных?

Ответы [ 4 ]

0 голосов
/ 16 июня 2019

Это работает для меня на Java:

final var allDataFamilyDf = allDataDf.withColumn("FamilySize",
    functions.col("SibSp").plus(functions.col("Parch")));
0 голосов
/ 09 мая 2018

Есть много разных способов сделать это. Вы можете использовать map, например:

val df = Seq((101,1,1,1,1,1),(102,2,2,2,2,2),(103,3,3,3,3,3)).toDF("id", "a", "b", "c", "d", "e")

df.map(row => (row.getString(0), row.getInt(1)+row.getInt(2)+row.getInt(3)))
  .toDF("id", "a+b+c")

Или вы можете использовать udf, например:

import org.apache.spark.sql.functions._
import spark.implicits._

val addCols = udf((a: Int, b:Int, c: Int) => a+b+c)
df.select('id, addCols('a, 'b, 'c) as "a+b+c")    

Или иди с предложением Шайдо :)

0 голосов
/ 09 мая 2018

если вы используете java, вы можете сделать следующее

import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.types.DataTypes;

static SparkConf conf = new SparkConf().setMaster("local").setAppName("simple");
static SparkContext sc = new SparkContext(conf);
static SQLContext sqlContext = new SQLContext(sc);

public static void main(String[] args) {

    Dataset<Row> df = sqlContext.read()
            .format("com.databricks.spark.csv")
            .option("delimiter", " ")
            .option("header", true)
            .option("inferSchema", true)
            .load("path to the input text file");


    sqlContext.udf().register("sums", (Integer a, Integer b, Integer c) -> a+b+c, DataTypes.IntegerType);
    df.registerTempTable("temp");
    sqlContext.sql("SELECT id, sums(a, b, c) AS `(a+b+c)` FROM temp").show(false);

}

и вы должны иметь вывод

+---+-------+
|id |(a+b+c)|
+---+-------+
|101|3      |
|102|6      |
|103|9      |
+---+-------+

Если вы предпочитаете обходиться без SQL-запроса и использовать API, тогда вы можете сделать, как показано ниже

import org.apache.spark.sql.expressions.UserDefinedFunction;
import org.apache.spark.sql.types.DataTypes;
import static org.apache.spark.sql.functions.col;
import static org.apache.spark.sql.functions.udf;

    UserDefinedFunction mode = udf((Integer a, Integer b, Integer c) -> a+b+c, DataTypes.IntegerType);
    df.select(col("id"), mode.apply(col("a"), col("b"), col("c")).as("(a+b+c)")).show(false);
0 голосов
/ 09 мая 2018

Вы можете создать строку с выражением, а затем использовать expr для создания столбца. Другими словами, в этом случае вы хотите создать строку «a + b + c», которую затем сможете использовать. Это будет работать для любого количества столбцов.

В Scala это может выглядеть следующим образом (это должно быть довольно просто перевести на Java):

import org.apache.spark.sql.functions.expr

val df = Seq((101,1,1,1,1,1),(102,2,2,2,2,2),(103,3,3,3,3,3)).toDF("id", "a", "b", "c", "d", "e") 

val cols = Seq("a", "b", "c")
val expression = cols.mkString("+")
val colName = "(" + expression + ")"
df.select($"id", expr(expression).as(colName))

, который даст вам:

+---+-------+
| id|(a+b+c)|
+---+-------+
|101|      3|
|102|      6|
|103|      9|
+---+-------+
...