Как объединить два столбца в фрейме данных Apache Spark? Есть ли в Spark SQL какая-либо функция, которую мы можем использовать?
117
Как объединить два столбца в фрейме данных Apache Spark? Есть ли в Spark SQL какая-либо функция, которую мы можем использовать?
С необработанным SQL вы можете использовать CONCAT
:
В Python
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
В Scala
import sqlContext.implicits._
val df = sc.parallelize(Seq(("foo", 1), ("bar", 2))).toDF("k", "v")
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
Начиная с Spark 1.5.0 вы можете использовать concat
функцию с DataFrame API:
В Python:
from pyspark.sql.functions import concat, col, lit
df.select(concat(col("k"), lit(" "), col("v")))
В Scala:
import org.apache.spark.sql.functions.{concat, lit}
df.select(concat($"k", lit(" "), $"v"))
Также существует concat_ws
функция, которая принимает в качестве первого аргумента разделитель строк.
Вот как можно настраивать именование
import pyspark
from pyspark.sql import functions as sf
sc = pyspark.SparkContext()
sqlc = pyspark.SQLContext(sc)
df = sqlc.createDataFrame([('row11','row12'), ('row21','row22')], ['colname1', 'colname2'])
df.show()
дает,
+--------+--------+
|colname1|colname2|
+--------+--------+
| row11| row12|
| row21| row22|
+--------+--------+
создать новый столбец, объединив:
df = df.withColumn('joined_column',
sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))
df.show()
+--------+--------+-------------+
|colname1|colname2|joined_column|
+--------+--------+-------------+
| row11| row12| row11_row12|
| row21| row22| row21_row22|
+--------+--------+-------------+
lit
создает столб_
Один из вариантов объединения строковых столбцов в Spark Scala - это использование
concat
.Необходимо проверить нулевые значения . Поскольку, если один из столбцов имеет значение NULL, результат будет нулевым, даже если в одном из других столбцов есть информация.
Использование
concat
иwithColumn
:Использование
concat
иselect
:В обоих подходах у вас будет NEW_COLUMN, значение которого представляет собой объединение столбцов: COL1 и COL2 из исходного df.
источник
concat_ws
вместоconcat
, вы можете избежать проверки на NULL.Если вы хотите сделать это с помощью DF, вы можете использовать udf для добавления нового столбца на основе существующих столбцов.
источник
Начиная с Spark 2.3 ( SPARK-22771 ) Spark SQL поддерживает оператор конкатенации
||
.Например;
источник
Вот еще один способ сделать это для pyspark:
источник
Вот предложение, если вы не знаете количество или имя столбцов в Dataframe.
источник
concat (* столбцы)
v1.5 и выше
Объединяет несколько входных столбцов в один столбец. Функция работает со строками, двоичными и совместимыми столбцами массива.
Например:
new_df = df.select(concat(df.a, df.b, df.c))
concat_ws (сеп, * столбцы)
v1.5 и выше
Аналогично,
concat
но использует указанный разделитель.Например:
new_df = df.select(concat_ws('-', df.col1, df.col2))
map_concat (* столбцы)
v2.4 и выше
Используется для объединения карт, возвращает объединение всех заданных карт.
Например:
new_df = df.select(map_concat("map1", "map2"))
Использование строкового оператора concat (
||
):v2.3 и выше
Например:
df = spark.sql("select col_a || col_b || col_c as abc from table_x")
Ссылка: Spark sql doc
источник
В Spark 2.3.0 вы можете:
источник
В Java вы можете сделать это для объединения нескольких столбцов. Образец кода должен предоставить вам сценарий и способы его использования для лучшего понимания.
Приведенный выше код объединил столбцы col1, col2, col3, разделенные знаком «_», чтобы создать столбец с именем «concatenatedCol».
источник
Есть ли у нас синтаксис Java, соответствующий процессу ниже
источник
Другой способ сделать это в pySpark, используя sqlContext ...
источник
В самом деле, есть несколько красивых встроенных абстракций, позволяющих выполнить конкатенацию без необходимости реализации специальной функции. Поскольку вы упомянули Spark SQL, я предполагаю, что вы пытаетесь передать его как декларативную команду через spark.sql (). Если это так, вы можете выполнить прямую передачу команды SQL, например:
SELECT CONCAT(col1, '<delimiter>', col2, ...) AS concat_column_name FROM <table_name>;
Кроме того, начиная с Spark 2.3.0, вы можете использовать команды в строках с:
SELECT col1 || col2 AS concat_column_name FROM <table_name>;
Где это ваш предпочтительный разделитель (также может быть пустое пространство) и временная или постоянная таблица, из которой вы пытаетесь читать.
источник
Мы также можем просто использовать SelectExpr. df1.selectExpr ("*", "верхний (_2 || _3) как новый")
источник