2017-04-04 3 views
0

사용자 당 여러 행을 가진 하이브 테이블 (ORC 파일 형식)에 저장된 사용자 데이터가 있습니다. 예를 들어 :하이브에서 PySpark를 사용하여 그룹당 데이터 처리

user | attr1 | attr2 
---- | ----- | ----- 
u1 | 1  | a 
u1 | 2  | b 
u2 | 3  | a 
u2 | 4  | b 

좀 문자열을 계산하기 위해 동일한 사용자에 속하는 행의 각 그룹을 매핑해야합니다. 이 예에서는 f([(1, a), (2, b)])f([(3, a), (4, b)])입니다.

Hive + Spark의 Python API를 사용하여 어떻게 수행 할 수 있습니까?

파이썬 GroupedData API에는 stat 함수 만 있습니다. 기본 행 RDD를 줄이려해야합니까? 그룹화를 위해 Hive/ORC 컬럼 형식을 사용하는보다 효율적인 방법이 있습니까?

답변

0
from pyspark.sql import functions as f 

df = spark.createDataFrame([['u1', 1, 'a'], ['u1', 2, 'b'], ['u2', 3, 'a'], ['u2', 4, 'b']], 
          schema=['user', 'attr1', 'attr2']) 
df = df.groupBy('user').agg(f.collect_list(f.array(df['attr1'], df['attr2'])).alias('array_col')) 
df = df.withColumn('len_col', f.size(df['new_col'])) 
df.show(truncate=False) 

+----+----------------------------------------+-------+       
|user|array_col        |len_col| 
+----+----------------------------------------+-------+ 
|u1 |[WrappedArray(1, a), WrappedArray(2, b)]|2  | 
|u2 |[WrappedArray(3, a), WrappedArray(4, b)]|2  | 
+----+----------------------------------------+-------+ 
관련 문제