我有一个大型(约 1000 万行).tsv 文件,其中包含两列:“id”和“group”。 “Group”列实际上是某个 id 所属的所有组的列表,因此该文件如下所示:
id1 group1,group2
id2 group2,group3,group4
id3 group1
...
我需要使用 pyspark 将其上传到 Hive 表,但是我想拆分组列,以便一行中只有一个组,因此生成的表如下所示:
id1 group1
id1 group2
id2 group2
id2 group3
id2 group4
id3 group1
我尝试过逐行读取行,然后使用 python split() 来分割列,然后为每一行创建 Spark 数据帧并将其与每次迭代合并。我的代码可以工作,但是效率极低,因为处理 1000 行需要 2 分钟。我的代码如下:
fields = [StructField('user_id', StringType(), True),StructField('group_id', StringType(), True)]
membership_schema = StructType(fields)
result_df = sqlContext.createDataFrame(sc.emptyRDD(), membership_schema)
with open('file.tsv','r') as f:
for line in f:
parts = line.split()
id_part = parts[0]
audience_parts = parts[1].split(',')
for item in audience_parts:
newRow = sqlContext.createDataFrame([(id_part,item)], membership_schema)
result_df = result_df.union(newRow)
df_writer = DataFrameWriter(result_df)
df_writer.insertInto("my_table_in_hive")
是否有一种更简单、更有效的方法将整个文件上传到表中,而无需迭代各行?
感谢帮助。