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

 

 

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

spark 데이터프레임 실습5  (0) 2024.01.24
spark 데이터프레임 실습4  (0) 2024.01.24
spark 데이터프레임 실습2  (0) 2024.01.23
spark 데이터프레임 실습1  (0) 2024.01.23
spark 기초 실습(colab)  (0) 2024.01.19
Spark DataFrame 실습1

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

spark 데이터프레임 실습3  (0) 2024.01.24
spark 데이터프레임 실습2  (0) 2024.01.23
spark 기초 실습(colab)  (0) 2024.01.19
spark 데이터 구조  (0) 2024.01.19
spark 데이터 처리  (0) 2024.01.18

+ Recent posts