SQL은 빅데이터 세상에서도 중요!
- 데이터 분야에서 일하고자 하면 반드시 익혀야할 기본 기술
- 구조화된 데이터를 다루는한 SQL은 데이터 규모와 상관없이 쓰임
- 모든 대용량 데이터 웨어하우스는 SQL 기반
- Redshift, Snowflake, BigQuery
- Hive/Presto - Spark도 예외는 아님
- Spark SQL이 지원됨
Spark SQL이란?
- 구조화된 데이터 처리:** Spark SQL은 주로 구조화된 데이터를 다루기 위해 설계되었습니다. 이는 표 형식의 데이터로써, 예를 들어 CSV 파일, Parquet 파일 등과 같은 데이터 형식을 포함합니다.
- SQL 처리:** Spark SQL을 사용하면 SQL 쿼리를 통해 데이터프레임 작업을 수행할 수 있습니다. 데이터프레임에 테이블 이름을 할당한 후, SQL 쿼리를 사용하여 데이터를 검색, 변환 및 분석할 수 있습니다.
```python
# Spark SQL을 사용한 데이터프레임에 SQL 쿼리 수행 예제
df.createOrReplaceTempView("my_table")
result = spark.sql("SELECT * FROM my_table WHERE age > 21")
``` - Pandas와 비슷한 패턴:** Spark SQL의 데이터프레임 작업은 Pandas에서 pandasql 모듈의 sqldf 함수와 유사한 패턴을 가지고 있습니다. 이는 구조화된 데이터를 SQL 스타일로 다룰 때 유용합니다.
- Hive 호환성:** Spark SQL은 Hive Query Language (HQL)과 호환되며, Hive Metastore를 통해 Hive 테이블을 읽고 쓸 수 있습니다. 이는 기존의 Hive 기반 시스템과의 통합을 가능케 합니다.
```python
# Hive 테이블을 읽어오는 예제
df = spark.sql("SELECT * FROM hive_table")
``` - 분산 쿼리 및 처리:** 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 활용
- Spark SQL을 사용하여 SQL을 수행하는 방법은 다음과 같습니다. 아래 예제는 데이터프레임을 기반으로 테이블 뷰를 생성하고, SQL 쿼리를 사용하여 결과를 데이터프레임으로 받아오는 과정을 보여줍니다.
- SparkSession 생성:
```python
from pyspark.sql import SparkSession
# SparkSession 생성
spark = SparkSession.builder.appName("example").getOrCreate()
``` - 데이터프레임 생성:
```python
# 데이터프레임 생성 (예시 데이터)
data = [("John", "Male"), ("Alice", "Female"), ("Bob", "Male"), ("Eve", "Female")]
columns = ["name", "gender"]
namegender_df = spark.createDataFrame(data, columns)
``` - 테이블 뷰 생성:
- `createOrReplaceTempView("namegender")`: 데이터프레임을 테이블 뷰로 등록합니다. 세션 동안 존재하며, 동일한 이름의 테이블 뷰가 이미 존재하는 경우 덮어씁니다.
```python
namegender_df.createOrReplaceTempView("namegender")
``` - 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
""")
``` - 결과 출력:
```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 |