Come concateniamo 2 colonne in un dataframe? Esiste una funzione in spark sql che possiamo usare per concatenare 2 colonne in una tabella df.Colonne concatenate in apache spark dataframe
risposta
Con SQL prime è possibile utilizzare CONCAT
:
In Python
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v")) df.registerTempTable("df") sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
In 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")
Dal momento che Spark 1.5.0 è possibile utilizzare concat
funzione wit h dataframe API:
In Python:
from pyspark.sql.functions import concat, col, lit df.select(concat(col("k"), lit(" "), col("v")))
In Scala:
import org.apache.spark.sql.functions.{concat, lit} df.select(concat($"k", lit(" "), $"v"))
C'è anche concat_ws
funzione che prende un separatore stringa come primo argomento.
Cosa succede se dataFrame ha valore nullo? come questo df = sqlContext.createDataFrame ([("foo", 1), ("bar", 2), ("check", null)], ("k", "v")) –
@TarunKumar Vuoi dire qualcosa come [questo] (http://stackoverflow.com/a/33152113/1560062)? – zero323
questo è quello che volevo. grazie –
Se si desidera utilizzare DF, è possibile utilizzare un udf per aggiungere una nuova colonna in base alle colonne esistenti.
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()
C'è un modo per concatenare dinamicamente le colonne da una stringa di input? – ashK
Questo non è ottimale, rispetto a DataFrame.concat_ws, poiché Spark non ottimizza molto bene udfs/affatto. Naturalmente, nel momento in cui hai bisogno di una logica personalizzata nella tua concatenazione, non sarai in grado di evitare l'udf. –
Ecco un altro modo di fare questo per 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|
+------------+
Un altro modo per farlo in pySpark usando 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'))
Ecco come si può fare denominazione personalizzata
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()
dà,
+--------+--------+
|colname1|colname2|
+--------+--------+
| row11| row12|
| row21| row22|
+--------+--------+
creare nuova colonna concatenando:
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|
+--------+--------+-------------+
Perché chiami 'sf.lit ('_')' e non solo ''_''? –
'lit' crea una colonna di' _' – muon
Ecco un suggerimento per quando non si conosce il numero o il nome delle colonne nel dataframe.
val dfResults = dfSource.select(concat_ws(",",dfSource.columns.map(c => col(c)): _*))
- 1. Colonne duplicate in Spark Dataframe
- 2. Come escludere più colonne in Spark dataframe in Python
- 3. Apache Spark: StackOverflowError durante il tentativo di indicizzare colonne stringa
- 4. Ricava più colonne da una singola colonna in Spark DataFrame
- 5. Spark colonne duplicate in dataframe dopo si uniscono
- 6. Apache Spark - Assegna il risultato di UDF a più colonne del dataframe
- 7. Apache Spark: come creare una matrice da un DataFrame?
- 8. Apache Spark: Come posso convertire uno Spark DataFrame in un RDD con tipo RDD [(Tipo1, Tipo2, ...)]?
- 9. Come ottenere altre colonne quando si utilizza Spark DataFrame groupby?
- 10. Spark dataframe distinguere le colonne con il nome duplicato
- 11. Spark DataFrame: operare sui gruppi
- 12. Spark DataFrame e ridenominazione di più colonne (Java)
- 13. Apache Spark vs Apache Ignite
- 14. Apache Spark vs. Apache Storm
- 15. concatenate pandas dataframe in un loop di file
- 16. Spark - Creating Nested DataFrame
- 17. Utilizzando R in Apache Spark
- 18. Apache Spark java.lang.ClassNotFoundException
- 19. Apache Drill vs Spark
- 20. Spark: scrittura DataFrame come compressa JSON
- 21. Spark: salva DataFrame partizionato dalla colonna "virtuale"
- 22. Conversione del dataframe di Pandas in errore Spark Dataframe
- 23. Ottieni CSV su Spark dataframe
- 24. Spark sql dataframe - Import sqlContext.implicits._
- 25. Eliminazione di una colonna nidificata Spark dataframe
- 26. Spark: Salva Dataframe in formato ORC
- 27. Come mappare un Dataframe nidificato in Spark
- 28. Sostituisci valori null in Spark DataFrame
- 29. Come accedere a DataFrame trasmesso in Spark
- 30. Creare labeledPoints da Spark DataFrame in Python
Hai alcune risposte qui solo per chiedere di essere accettato;) – user8371915