提问者:小点点

连接Apache Spark数据帧中的列


如何在Apache Spark DataFrame中连接两列?SparkSQL中有什么我们可以使用的功能吗?


共3个答案

匿名用户

对于原始SQL,您可以使用CONCAT

>

df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ',  v) FROM df")

在斯卡拉

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以来,您可以在DataFrame API中使用conat函数:

>

  • 在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|
    +--------+--------+-------------+
    

    匿名用户

    在Spark Scala中连接字符串列的一个选项是使用concat

    有必要检查空值。因为如果其中一列为null,即使其他列中的一列确实有信息,结果也将为null。

    使用concatwith column

    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选择:

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

    使用这两种方法,您将有一个新的_列,其值是列的串联:来自原始df的COL1和COL2。