복붙노트

[SQL] 아파치 스파크 DataFrame에 연결하여 열

SQL

아파치 스파크 DataFrame에 연결하여 열

우리는 어떻게 아파치 스파크 DataFrame에 두 개의 열을 연결합니까? 우리가 사용할 수있는 스파크 SQL의 모든 기능이 있습니까?

해결법

  1. ==============================

    1.원시 SQL 사용하면 CONCAT을 사용할 수 있습니다 :

    원시 SQL 사용하면 CONCAT을 사용할 수 있습니다 :

    스파크 1.5.0 이후 당신은 DataFrame API를 CONCAT 기능을 사용할 수 있습니다 :

    제 인수 문자열 세퍼레이터 소요 CONCAT_WS 기능도있다.

  2. ==============================

    2.여기에 사용자 정의 이름을 할 수있는 방법

    여기에 사용자 정의 이름을 할 수있는 방법

    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|
    +--------+--------+-------------+
    
  3. ==============================

    3.스파크 스칼라에서 CONCATENATE 문자열 열을 하나의 옵션은 CONCAT를 사용하고 있습니다.

    스파크 스칼라에서 CONCATENATE 문자열 열을 하나의 옵션은 CONCAT를 사용하고 있습니다.

    널 (null) 값을 확인하는 것이 필요하다. 열 중 하나가 null의 경우, 결과는 널 (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 선택 사용 :

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

    원래 안양에서 COL1과 COL2 : 모두 당신이 값이 컬럼의 연결입니다 NEW_COLUMN이있을 것이다 접근으로.

  4. ==============================

    4.당신이 DF를 사용하여 수행 할 경우, 기존 열을 기반으로 새 열을 추가 UDF를 사용할 수 있습니다.

    당신이 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()
    
  5. ==============================

    5.스파크 2.3에서 (SPARK-22771)은 스파크 SQL은 연결 연산자를 || 지원합니다.

    스파크 2.3에서 (SPARK-22771)은 스파크 SQL은 연결 연산자를 || 지원합니다.

    예를 들어;

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

    6.여기 pyspark을 위해이 일을하는 또 다른 방법은 다음과 같습니다

    여기 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|
    +------------+
    
  7. ==============================

    7.다음은 Dataframe의 열 번호 나 이름을 모르는 경우에 대한 제안입니다.

    다음은 Dataframe의 열 번호 나 이름을 모르는 경우에 대한 제안입니다.

    val dfResults = dfSource.select(concat_ws(",",dfSource.columns.map(c => col(c)): _*))
    
  8. ==============================

    8.스파크 2.3.0, 당신은 할 수 있습니다 :

    스파크 2.3.0, 당신은 할 수 있습니다 :

    spark.sql( """ select '1' || column_a from table_a """)
    
  9. ==============================

    9.자바에서는이 여러 열을 연결하는 할 수 있습니다. 샘플 코드는 당신에게 시나리오 어떻게 더 나은 이해를 위해 그것을 사용하는 방법을 제공하는 것입니다.

    자바에서는이 여러 열을 연결하는 할 수 있습니다. 샘플 코드는 당신에게 시나리오 어떻게 더 나은 이해를 위해 그것을 사용하는 방법을 제공하는 것입니다.

    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 "는 골을 연접"이름 열을 만드는 "_"로 분리된다.

  10. ==============================

    10.또 다른 방법은는 SqlContext를 사용하여 pySpark에서 할 수 있습니다 ...

    또 다른 방법은는 SqlContext를 사용하여 pySpark에서 할 수 있습니다 ...

    #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'))
    
  11. ==============================

    11.실제로, 사용자 정의 기능을 구현 할 필요없이 연결을 달성하기 위해 아름다운 붙박이 추상화가있다. 당신이 스파크 SQL을 언급 한 이후, 그래서 당신이 spark.sql를 통해 선언 명령로 전달하려고하는 추측하고있다 (). 그렇다면, 당신은 같은 SQL 명령을 전달하는 정직 방식으로 수행 할 수 있습니다 : SELECT CONCAT FROM concat_column_name AS (COL1 '<분리>', COL2, ...);

    실제로, 사용자 정의 기능을 구현 할 필요없이 연결을 달성하기 위해 아름다운 붙박이 추상화가있다. 당신이 스파크 SQL을 언급 한 이후, 그래서 당신이 spark.sql를 통해 선언 명령로 전달하려고하는 추측하고있다 (). 그렇다면, 당신은 같은 SQL 명령을 전달하는 정직 방식으로 수행 할 수 있습니다 : SELECT CONCAT FROM concat_column_name AS (COL1 '<분리>', COL2, ...);

    또한, 스파크 2.3.0에서, 당신과 함께 라인에서 명령을 사용할 수 있습니다 : SELECT COL1 || COL2 AS는 FROM concat_column_name;

    , 원하는 구분되는 것을 특징으로하는 (물론 빈 공간 일 수있다) 당신이 읽을하려고하는 임시 또는 영구 테이블입니다.

  12. ==============================

    12.우리는 과정을 아래에 해당하는 자바 구문을 가지고 있습니까

    우리는 과정을 아래에 해당하는 자바 구문을 가지고 있습니까

    val dfResults = dfSource.select(concat_ws(",",dfSource.columns.map(c => col(c)): _*))
    
  13. from https://stackoverflow.com/questions/31450846/concatenate-columns-in-apache-spark-dataframe by cc-by-sa and MIT license