추후에 데일리 배치를 돌릴 예정이기 때문에 데일리 파티션으로 하이브 테이블을 생성할 생각이라 미리 테스트할 겸 쓰게되었다.
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType,StructField, StringType, IntegerType, DateType
from pyspark.sql.functions import lit
from datetime import date
today = date.today()
spark = SparkSession.builder \
.appName("ParquetSaver") \
.config("spark.jars", "/usr/lib/spark/jars/commons-pool2-2.12.0.jar")\
.getOrCreate()
data2 = [("James","","Smith","36636","M",3000),
("Michael","Rose","","40288","M",4000),
("Robert","","Williams","42114","M",4000),
("Maria","Anne","Jones","39192","F",4000),
("Jen","Mary","Brown","","F",-1)
]
schema = StructType([ \
StructField("firstname",StringType(),True), \
StructField("middlename",StringType(),True), \
StructField("lastname",StringType(),True), \
StructField("id", StringType(), True), \
StructField("gender", StringType(), True), \
StructField("salary", IntegerType(), True) \
])
df = spark.createDataFrame(data=data2,schema=schema)
df = df.withColumn("partition_date", lit(today))
df.write.mode("overwrite").parquet(f"hdfs://private-dns:8020/testdir2/{today}/testtable2_{today}.parquet")
잘 저장 되었고... 였지만 잘못했다.
df.write.mode("overwrite").parquet(f"hdfs://private-dns:8020/usr/livy/testdir2/partition_date={today}/testtable2_{today}.parquet")
이렇게 저장을 해줘야한다 (맨날 delta 쓰고...Databricks만 쓰니까 이런거를 모르지)
후에 아래 쿼리로 테이블을 만들어 주고
CREATE EXTERNAL TABLE testtable2(
firstname string ,
middlename string ,
lastname string ,
id string ,
gender string ,
salary integer
)
PARTITIONED BY(partition_date date)
STORED AS PARQUET
LOCATION 'hdfs://private_dns:8020/usr/livy/testdir2/';
'2023-10-31' 과 같이 새로운 날짜에 데이터가 들어왔을 가정시
ALTER TABLE testtable2 ADD PARTITION (partition_date='2023-10-31');
로 마스킹을 해줘야 새로운 데이터가 조회가 되기 시작한다. 추후에 이 부분도 자동화가 필요할 것으로 보인다.
중간중간 beeline 에서 사용하는 anonymos user 와 livy user로 생성되는 경로 때문에 권한 문제가 발생하긴 하였지만 결과적으로는 테이블은 잘 보인다.
+-----------------------+------------------------+----------------------+----------------+--------------------+--------------------+----------------------------+
| testtable2.firstname | testtable2.middlename | testtable2.lastname | testtable2.id | testtable2.gender | testtable2.salary | testtable2.partition_date |
+-----------------------+------------------------+----------------------+----------------+--------------------+--------------------+----------------------------+
| James | | Smith | 36636 | M | 3000 | 2023-10-31 |
| Michael | Rose | | 40288 | M | 4000 | 2023-10-31 |
| Robert | | Williams | 42114 | M | 4000 | 2023-10-31 |
| Maria | Anne | Jones | 39192 | F | 4000 | 2023-10-31 |
| Jen | Mary | Brown | | F | -1 | 2023-10-31 |
| James | | Smith | 36636 | M | 3000 | 2023-11-01 |
| Michael | Rose | | 40288 | M | 4000 | 2023-11-01 |
| Robert | | Williams | 42114 | M | 4000 | 2023-11-01 |
| Maria | Anne | Jones | 39192 | F | 4000 | 2023-11-01 |
| Jen | Mary | Brown | | F | -1 | 2023-11-01 |
+-----------------------+------------------------+----------------------+----------------+--------------------+--------------------+----------------------------+