比方说,我有一个名为events
的Hive表,具有以下架构:
user_id bigint
visited_cities array<int>
字段visited_cities
是一个整数数组,表示给定用户访问过的城市。数组可能包含重复元素,所以我想删除重复元素。
例如,https://github.com/klout/brickhouse/blob/master/src/main/java/brickhouse/udf/collect/CombineUniqueUDAF.java可能有可用的Hive UDF。但是该表在我的系统中非常庞大,因此我需要使用Spark对其进行处理。
以下是有效代码
from pyspark import SparkContext
from pyspark.sql import HiveContext
from pyspark.sql.types import ArrayType, IntegerType
sc = SparkContext()
sqlContext = HiveContext(sc)
def get_unique(elements):
return list(set(elements))
sqlContext.udf.register("udf_get_unique", get_unique, ArrayType(IntegerType()))
query = '''
select user_id, udf_get_unique(visited_cities) as visited_cities
from events
'''
history_data = sqlContext.sql(query)
从现在开始,我陷入困境。如果我想向HDFS写入history_data
,如何指定架构?我希望使用.saveAsTextFile
。我需要处理的另一件事是,原始表中的数组可能为空。