Spark:如何将包含array <int>作为其列之一的DataFrame写入HDFS?

时间:2018-07-27 04:10:37

标签: apache-spark pyspark apache-spark-sql

比方说,我有一个名为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。我需要处理的另一件事是,原始表中的数组可能为空。

0 个答案:

没有答案