Python

Spark의 Dataframe , Pandas의 Dataframe 활용하기

helenaaaaa 2023. 1. 25. 14:26

Q. Databricks에서 Spark SQL 로 특정 데이터를 select해서 dataframe을 만들었다. 그 df에 iloc, loc 등의 속성을 사용하려고 하니 존재하지 않는 속성이라고 에러가 발생했다. 

AttributeError 발생

A. Dataframe(made by Spark) , Dataframe(made by Pandas)  어떻게 만들어진 Dataframe이냐에 따라서 다르게 사용해야 한다.

 

예를 들어, 다음과 같은 test 테이블이 있다고 가정해보자.(해당 테이블은 pyspark로 생성되었음)

 'test'라는 테이블의 'id' 컬럼의 값 개수를 센 후, 해당 수가 1 이상이면 True를 , 아니면 False를 Print하고 싶다면..?

 

1. Dataframe(made by Spark) 그대로 사용하기

df = spark.sql("select count(id) as cnt from test")

case1) TempView 생성해서 사용하기

 # TempView 생성해서 사용하기
 df.createOrReplaceTempView('tempTest')
SELECT CASE WHEN cnt >= 1 THEN 'TRUE' 
			ELSE 'FALSE' 
       END ID_STAT 
  FROM temptest;

case2) count() 속성 사용하기 

if df.count()>= 1:
    print('true')
else : 
    print('false')
df_org = spark.sql("select id  from test");
# distinct count
cnt = df_org.distinct().count()
if cnt >= 1:
    print('true')
else : 
    print('false')

2. Dataframe(made by Spark) 를 Dataframe(made by Pandas)로 변환하여 사용하기

#pyspark >> pandas로 변환
df = spark.sql("select count(id) as cnt from test").toPandas()
#iloc : 데이터프레임의 행이나 칼럼의 순서를 나타내는 정수로 특정 값을 추출해온다.
#df.iloc[0] : df에서 0번째 행에 있는 값들만 추출해라!
#item() : 주어진 시리즈 객체의 기본 데이터의 첫번째 요소를 스칼라로 반환(크키가 1인 배열만 변환 가능)
cnt = df.iloc[0].item() #해당 df.iloc[0]은 count값 하나만 들어있기때문에 item() 사용해도 무난!

#print(cnt) 

b=0
while b<3:
    if cnt >=1:
        print('true')
        b=10
    else:
        print('false')
        print(b)
        b=b+1