SQL은 빅데이터 세상에서도 중요!

  • 데이터 분야에서 일하고자 하면 반드시 익혀야할 기본 기술
  • 구조화된 데이터를 다루는한 SQL은 데이터 규모와 상관없이 쓰임
  • 모든 대용량 데이터 웨어하우스는 SQL 기반
    - Redshift, Snowflake, BigQuery
    - Hive/Presto
  • Spark도 예외는 아님
    - Spark SQL이 지원됨

Spark SQL이란?

  1. 구조화된 데이터 처리:** Spark SQL은 주로 구조화된 데이터를 다루기 위해 설계되었습니다. 이는 표 형식의 데이터로써, 예를 들어 CSV 파일, Parquet 파일 등과 같은 데이터 형식을 포함합니다.

  2. SQL 처리:** Spark SQL을 사용하면 SQL 쿼리를 통해 데이터프레임 작업을 수행할 수 있습니다. 데이터프레임에 테이블 이름을 할당한 후, SQL 쿼리를 사용하여 데이터를 검색, 변환 및 분석할 수 있습니다.
       ```python
       # Spark SQL을 사용한 데이터프레임에 SQL 쿼리 수행 예제
       df.createOrReplaceTempView("my_table")
       result = spark.sql("SELECT * FROM my_table WHERE age > 21")
       ```
  3. Pandas와 비슷한 패턴:** Spark SQL의 데이터프레임 작업은 Pandas에서 pandasql 모듈의 sqldf 함수와 유사한 패턴을 가지고 있습니다. 이는 구조화된 데이터를 SQL 스타일로 다룰 때 유용합니다.

  4. Hive 호환성:** Spark SQL은 Hive Query Language (HQL)과 호환되며, Hive Metastore를 통해 Hive 테이블을 읽고 쓸 수 있습니다. 이는 기존의 Hive 기반 시스템과의 통합을 가능케 합니다.
       ```python
       # Hive 테이블을 읽어오는 예제
       df = spark.sql("SELECT * FROM hive_table")
       ```
  5. 분산 쿼리 및 처리:** Spark SQL은 Apache Spark의 일부로서 분산 환경에서 동작하며, 대규모 데이터를 효과적으로 처리할 수 있습니다.

Spark SQL vs. DataFrame

  • 하지만 SQL로 가능한 작업이라면 DataFrame을 사용할 이유가 없음
    두 개를 동시에 사용할 수 있다는 점 분명히 기억

    1. Familiarity/Readability
    ● SQL이 가독성이 더 좋고 더 많은 사람들이 사용가능

    2. Optimization
    ● Spark SQL 엔진이 최적화하기 더 좋음 (SQL은 Declarative)
    Catalyst Optimizer : 쿼리 실행 엔진을 최적화
    Project Tungsten : 높은 성능과 메모리 효율성을 제공

    3. Interoperability/Data Management
    ● SQL이 포팅(특정 데이터베이스 제품에 종속되지 않고 이식성이 뛰어남)도 쉽고 접근권한 체크도 쉬움

Spark SQL 사용법 - SQL 활용

  1. Spark SQL을 사용하여 SQL을 수행하는 방법은 다음과 같습니다. 아래 예제는 데이터프레임을 기반으로 테이블 뷰를 생성하고, SQL 쿼리를 사용하여 결과를 데이터프레임으로 받아오는 과정을 보여줍니다.
  2. SparkSession 생성:
       ```python
       from pyspark.sql import SparkSession

       # SparkSession 생성
       spark = SparkSession.builder.appName("example").getOrCreate()
       ```
  3. 데이터프레임 생성:
       ```python
       # 데이터프레임 생성 (예시 데이터)
       data = [("John", "Male"), ("Alice", "Female"), ("Bob", "Male"), ("Eve", "Female")]
       columns = ["name", "gender"]
       namegender_df = spark.createDataFrame(data, columns)
       ```
  4. 테이블 뷰 생성:
       - `createOrReplaceTempView("namegender")`: 데이터프레임을 테이블 뷰로 등록합니다. 세션 동안 존재하며, 동일한 이름의 테이블 뷰가 이미 존재하는 경우 덮어씁니다.
       ```python
       namegender_df.createOrReplaceTempView("namegender")
       ```
  5. SQL 쿼리 수행:
       - `spark.sql("SELECT gender, count(1) FROM namegender GROUP BY gender")`: SQL 쿼리를 실행하여 결과를 데이터프레임으로 받아옵니다. 결과 데이터프레임은 `namegender_group_df`에 저장됩니다.
       ```python
       namegender_group_df = spark.sql("""
           SELECT gender, count(1) FROM namegender GROUP BY gender
       """)
       ```
  6. 결과 출력:
       ```python
       # 결과 출력
       print(namegender_group_df.collect())
       ```
    이를 통해 Spark SQL을 사용하여 데이터프레임을 통한 SQL 쿼리를 실행하고 결과를 다룰 수 있습니다. 주의: 실제 환경에서는 데이터 소스를 로드하거나 외부 데이터에 쿼리를 실행하는 등의 더 복잡한 작업이 수행될 수 있습니다.

 

sparkSession 사용 외부 데이터베이스 연결

  • Spark Session의 read 함수를 호출(로그인 관련 정보와 읽어오고자 하는 테이블 혹은 SQL을 지정)
# df_user_session_channel 데이터프레임을 생성하기 위해 SparkSession을 이용합니다.
df_user_session_channel = spark.read \

 # JDBC 데이터 소스를 사용하도록 지정합니다.
    .format("jdbc") \ 

# 사용할 JDBC 드라이버를 지정합니다. 여기서는 Amazon Redshift용 드라이버를 사용합니다.
    .option("driver", "com.amazon.redshift.jdbc42.Driver") \  

# 데이터베이스 연결 정보를 지정합니다. HOST, PORT, DB, ID, PASSWORD는 실제 값으로 대체되어야 합니다.
    .option("url", "jdbc:redshift://HOST:PORT/DB?user=ID&password=PASSWORD") \  

# 읽어올 테이블의 이름을 지정합니다.
    .option("dbtable", "raw_data.user_session_channel") \  

# 데이터를 읽어와서 데이터프레임을 생성합니다.
    .load() 

 

'하둡,spark' 카테고리의 다른 글

UDF(User Defined Function) 사용해보기.  (1) 2024.01.25
spark sql에서 join  (0) 2024.01.25
spark 데이터프레임 실습5  (0) 2024.01.24
spark 데이터프레임 실습4  (0) 2024.01.24
spark 데이터프레임 실습3  (0) 2024.01.24

+ Recent posts