ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spark] Spark lit 알아보기
    Spark 2023. 12. 24. 21:29
    728x90
    반응형

    - 목차

     

    소개.

    프로그래밍 언어에서 literal 이라는 표현법이 존재합니다.

    literal 은 어떠한 자료형을 표현하는 정석적인 방법이 아니라 손쉽게 표현할 수 있는 방법을 의미하며,

    이는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해서 허용되는 형태입니다.

     

    예를 들어, 여러가지 프로그래밍 언어에서 배열을 표현하는 방법에 대해서 얘기해보겠습니다.

    javascript 에서 배열을 생성하기 위해 정석적인 방법은 아래와 같이 Array 클래스를 사용하는 것입니다.

    Array(1,2,3,4,5)

     

    하지만 아래와 같은 형식도 제공되죠.

    [1,2,3,4,5]

     

    python 에서 배열을 생성하는 방법은 아래와 같이 제공되며,

    list([1, 2, 3, 4, 5])
    [1, 2, 3, 4, 5]
    range(1, 5)

     

    java 에서도 아래와 같은 방식이 제공됩니다.

    int[] array = new int[5];
    array[0] = 1; array[1] = 2; array[2] = 3; array[3] = 4; array[4] = 5;
    
    int[] array = new int[]{1, 2, 3, 4, 5};

     

    literal 은 위와 같이 생성자를 활용한 정석적인 방식이 아닌 손쉽게 사용하는 방식을 허용하는 표현방식입니다.

     

    Spark 에서도 Spark 의 Data Type 과 lit function 이 제공됩니다.

    이번 글에서 Spark 의 lit function 에 대해서 알아보려고 합니다.

     

    Type Inference.

    Spark 의 lit function 은 lit( Java Object ) 와 같은 형태로 사용됩니다.

    lit 의 인자는 Java Object 이구요.

    이 말은 곧 모든 객체를 수용할 수 있는 구조입니다.

    Spark lit Function 이 Data Type 을 추론하는 방식은 미리 정의되어 있는 변환 규칙을 따르는데요.

    JVM 런타임에서 표현되는 자료형과 Spark 의 Data Type 에 대한 매핑 규칙이 정해져 있습니다.

    ( 즉, java, scala, python 의 데이터를 Spark 의 적절한 형식으로 변형합니다. )

     

    아래 예시는 JVM Data Type 이 어떻게 Spark Data Type 으로 변환되는지에 대한 예시입니다.

    저는 5개의 Data Type 의 변환을 코드로써 나타내었습니다.

    String, Integer, Double, Boolean, Timestamp 를 Spark Data Type 으로 변환하였습니다.

    package org.example;
    
    import org.apache.spark.sql.*;
    import org.apache.spark.sql.types.StructType;
    
    import java.time.Instant;
    import java.util.List;
    
    
    public class ReadTextFile {
      public static void main(String[] args) {
        SparkSession session = SparkSession.builder()
                .appName("processor-movie-ratings")
                .master("local[*]")
                .config("spark.driver.bindAddress", "127.0.0.1")
                .getOrCreate();
    
        Row emptyRow = RowFactory.create();
        StructType structType = new StructType();
        Dataset<Row> dataset = session.createDataFrame(List.of(emptyRow, emptyRow, emptyRow), structType);
    
        Column integerColumn = functions.lit(1 + 2 + 3 + 4 - 100);
        Column doubleColumn = functions.lit(Double.parseDouble("1.5"));
        Column stringColumn = functions.lit("1 + 2 + 3 + 4 - 100");
        Column booleanColumn = functions.lit(1 == 2);
        Column timestampColumn = functions.lit(Instant.parse("2024-01-01T00:00:00.000Z"));
    
        dataset = dataset.withColumn("integer", integerColumn);
        dataset = dataset.withColumn("double", doubleColumn);
        dataset = dataset.withColumn("string", stringColumn);
        dataset = dataset.withColumn("boolean", booleanColumn);
        dataset = dataset.withColumn("timestamp", timestampColumn);
    
        dataset.printSchema();
        dataset.show();
    
      }
    }
    root
     |-- integer: integer (nullable = false)
     |-- double: double (nullable = false)
     |-- string: string (nullable = false)
     |-- boolean: boolean (nullable = false)
     |-- timestamp: timestamp (nullable = false)
    
    +-------+------+-------------------+-------+-------------------+
    |integer|double|             string|boolean|          timestamp|
    +-------+------+-------------------+-------+-------------------+
    |    -90|   1.5|1 + 2 + 3 + 4 - 100|  false|2024-01-01 09:00:00|
    |    -90|   1.5|1 + 2 + 3 + 4 - 100|  false|2024-01-01 09:00:00|
    |    -90|   1.5|1 + 2 + 3 + 4 - 100|  false|2024-01-01 09:00:00|
    +-------+------+-------------------+-------+-------------------+

    반응형
Designed by Tistory.