Как добавить значения префикса и суффикса для столбца в искровом фрейме с использованием scala [duplicate]

t = str(timedelta(seconds=500000)) 

print t[:-6] + ' hours ' + t[-5:-3] + ' mins'
51
задан Community 17 June 2018 в 10:01
поделиться

10 ответов

В Spark 2.3.0 вы можете:

spark.sql( """ select '1' || column_a from table_a """)
1
ответ дан Charlie 木匠 16 August 2018 в 11:34
поделиться

Если вы хотите сделать это с помощью DF, вы можете использовать udf для добавления нового столбца на основе существующих столбцов.

val sqlContext = new SQLContext(sc)
case class MyDf(col1: String, col2: String)

//here is our dataframe
val df = sqlContext.createDataFrame(sc.parallelize(
    Array(MyDf("A", "B"), MyDf("C", "D"), MyDf("E", "F"))
))

//Define a udf to concatenate two passed in string values
val getConcatenated = udf( (first: String, second: String) => { first + " " + second } )

//use withColumn method to add a new column called newColName
df.withColumn("newColName", getConcatenated($"col1", $"col2")).select("newColName", "col1", "col2").show()
14
ответ дан Danish Shrestha 16 August 2018 в 11:34
поделиться
  • 1
    Есть ли способ динамически конкатенации столбцов из входной строки? – ashK 11 March 2017 в 09:42
  • 2
    Это не оптимально, по сравнению с DataFrame.concat_ws, так как Spark не очень хорошо оптимизирует udfs / вообще. Конечно, в тот момент, когда вам нужна пользовательская логика в вашей конкатенации, вы не сможете избежать udf. – Rick Moritz 15 March 2017 в 09:44

Вот еще один способ сделать это для pyspark:

#import concat and lit functions from pyspark.sql.functions 
from pyspark.sql.functions import concat, lit

#Create your data frame
countryDF = sqlContext.createDataFrame([('Ethiopia',), ('Kenya',), ('Uganda',), ('Rwanda',)], ['East Africa'])

#Use select, concat, and lit functions to do the concatenation
personDF = countryDF.select(concat(countryDF['East Africa'], lit('n')).alias('East African'))

#Show the new data frame
personDF.show()

----------RESULT-------------------------

84
+------------+
|East African|
+------------+
|   Ethiopian|
|      Kenyan|
|     Ugandan|
|     Rwandan|
+------------+
15
ответ дан desertnaut 16 August 2018 в 11:34
поделиться

Один параметр для конкатенации строковых столбцов в Spark Scala использует concat.

Нужно проверить нулевые значения. Потому что, если один из столбцов имеет значение NULL, результат будет нулевым, даже если один из столбцов имеет информацию.

Используя concat и withColumn:

val newDf = df.withColumn("NEW_COLUMN", concat(when(col("COL1").isNotNull,col("COL1")).otherwise(lit("null"), when(col("COL2").isNotNull,col("COL2")).otherwise(lit("null")))

Используя concat и select:

val newDf = df.selectExpr("concat(nvl(COL1, ''), nvl(COL2, '')) as NEW_COLUMN")

В обоих подходах вы будете иметь NEW_COLUMN, значение которого представляет собой конкатенацию столбцов: COL1 и COL2 из вашего исходного df.

2
ответ дан Ignacio Alorre 16 August 2018 в 11:34
поделиться

Spark SQL Context поддерживает оператор конкатенации ||. Например:

val df = sqlContext.sql("select _c1||_c2 as concat_column from <table_name>")

Моя искра версии 2.3.0

-1
ответ дан Krishas 16 August 2018 в 11:34
поделиться
  • 1
    Пока вы голосуете за правильный ответ, будьте терпеливы, чтобы прокомментировать «почему». Позволяет не наказывать сообщество за попытку быть полезным. – Krishas 9 August 2018 в 06:50

Другой способ сделать это в pySpark, используя sqlContext ...

#Suppose we have a dataframe:
df = sqlContext.createDataFrame([('row1_1','row1_2')], ['colname1', 'colname2'])

# Now we can concatenate columns and assign the new column a name 
df = df.select(concat(df.colname1, df.colname2).alias('joined_colname'))
0
ответ дан mrsrinivas 16 August 2018 в 11:34
поделиться

Вот предложение, когда вы не знаете число или имя столбцов в Dataframe.

val dfResults = dfSource.select(concat_ws(",",dfSource.columns.map(c => col(c)): _*))
3
ответ дан Paul Roub 16 August 2018 в 11:34
поделиться
  • 1
    dfSource.columns.map (c = & gt; col (c)): _ *)) не работает для меня, ожидая фактического массива seq [column] [Any] – sri hari kali charan Tummala 20 March 2018 в 20:04
  • 2
    dfNew2.select (concat_ws (",", dfNew2.columns.map (c = & gt; col (c)): _ *)), мой файловый фрейм генерируется из файла csv, используя искровые данные, кирпичи csv praser – sri hari kali charan Tummala 20 March 2018 в 20:05

В Java вы можете сделать это, чтобы объединить несколько столбцов. Образец кода - предоставить вам сценарий и как его использовать для лучшего понимания.

SparkSession spark = JavaSparkSessionSingleton.getInstance(rdd.context().getConf());
Dataset<Row> reducedInventory = spark.sql("select * from table_name")
                        .withColumn("concatenatedCol",
                                concat(col("col1"), lit("_"), col("col2"), lit("_"), col("col3")));


class JavaSparkSessionSingleton {
    private static transient SparkSession instance = null;

    public static SparkSession getInstance(SparkConf sparkConf) {
        if (instance == null) {
            instance = SparkSession.builder().config(sparkConf)
                    .getOrCreate();
        }
        return instance;
    }
}

Вышеупомянутый код объединил col1, col2, col3, разделенный «_», чтобы создать столбец с именем «concatenatedCol ».

-1
ответ дан wandermonk 16 August 2018 в 11:34
поделиться

С помощью raw 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 с API DataFrame:

  • В 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, которая принимает разделитель строк в качестве первого аргумента.

93
ответ дан zero323 16 August 2018 в 11:34
поделиться
  • 1
    Что делать, если dataFrame имеет нулевое значение? например, df = sqlContext.createDataFrame ([("foo", 1), ("bar", 2), ("проверка", null)], ("k", "v")) – Tarun Kumar 28 April 2016 в 10:25
  • 2
    @TarunKumar Вы имеете в виду что-то вроде this ? – zero323 28 April 2016 в 10:29
  • 3
    это то, чего я хотел. благодаря – Tarun Kumar 28 April 2016 в 11:08
  • 4
    Есть ли причина, по которой + не перегружается для конкатенации столбцов строки, точно так же, как она перегружена для численного добавления числовых столбцов? – max 21 June 2016 в 07:13
  • 5
    Кто-нибудь еще имеет проблему, когда метод df.select(concat(...)) изменяет имя столбца на что-то очень уродливое? – Katya Handler 28 July 2016 в 18:59
  • 6
    – abeboparebop 20 November 2017 в 14:32

Вот как вы можете сделать индивидуальное именование

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()

, [// g1]

+--------+--------+
|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|
+--------+--------+-------------+
15
ответ дан desertnaut 16 August 2018 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: