使用Scala和Spark在单独的配置单元分区上并行运行任务,以加速加载配置单元并将结果写入配置单元或拼花地板
这个问题是[这个问题]的衍生问题 编辑请看我在这篇文章底部的更新编辑 我使用了Scala和现在的Pyspark来完成相同的任务,但是我在将数据帧保存到拼花地板或csv或将数据帧转换为列表或数组类型的数据结构时遇到了问题。以下是相关的python/Pypark代码和信息:使用Scala和Spark在单独的配置单元分区上并行运行任务,以加速加载配置单元并将结果写入配置单元或拼花地板,scala,python-2.7,hive,pyspark,apache-spark-1.3,Scala,Python 2.7,Hive,Pyspark,Apache Spark 1.3,这个问题是[这个问题]的衍生问题 编辑请看我在这篇文章底部的更新编辑 我使用了Scala和现在的Pyspark来完成相同的任务,但是我在将数据帧保存到拼花地板或csv或将数据帧转换为列表或数组类型的数据结构时遇到了问题。以下是相关的python/Pypark代码和信息: #Table is a List of Rows from small Hive table I loaded using #query = "SELECT * FROM Table" #Table = sqlContext.s
#Table is a List of Rows from small Hive table I loaded using
#query = "SELECT * FROM Table"
#Table = sqlContext.sql(query).collect()
for i in range(len(Table)):
rows = sqlContext.sql(qry)
val1 = Table[i][0]
val2 = Table[i][1]
count = Table[i][2]
x = 100 - count
#hivetemp is a table that I copied from Hive to my hfs using:
#create external table IF NOT EXISTS hive temp LIKE hivetableIwant2copy LOCATION "/user/name/hiveBackup";
#INSERT OVERWRITE TABLE hivetemp SELECT * FROM hivetableIwant2copy;
query = "SELECT * FROM hivetemp WHERE col1<>\""+val1+"\" AND col2 ==\""+val2+"\" ORDER BY RAND() LIMIT "+str(x)
rows = sqlContext.sql(query)
rows = rows.withColumn("col4", lit(10))
rows = rows.withColumn("col5", lit(some_string))
#writing to parquet is heck slow AND I can't work with pandas due to the library not installed on the server
rows.saveAsParquetFile("rows"+str(i)+".parquet")
#tried this before and heck slow also
#rows_list = rows.collect()
#shuffle(rows_list)
我曾尝试在Scala中执行上述操作,但也遇到了类似的问题。我可以轻松地加载配置单元表或配置单元表的查询,但需要进行随机洗牌或存储大型数据帧会遇到内存问题。另外,添加两个额外的列也有一些挑战
我要添加行的配置单元表hiveTemp有5570000~550万行和120列
我在for循环中迭代的配置单元表有5000行和3列。hiveTemp中有25个独特的val1 a列,以及val1和val2 3000的组合。Val2可以是5列中的一列及其特定单元格值。这意味着如果我调整了代码,那么我可以将行的查找从5000减少到26,但是我必须检索、存储和随机洗牌的行数将非常大,因此会出现内存问题,除非有人对此提出建议
至于我需要添加到表中的行总数可能是100000
最终的目标是将原来的5.5毫米行的表附加上100k+行,作为蜂窝或拼花地板表写入。如果更简单的话,我可以在自己的表中写入100k行,稍后可以合并到5.5 mill表中
Scala或Python很好,但Scala更受欢迎
任何关于这方面的建议和最好的选择都是非常好的
非常感谢
编辑
关于这个问题,我还有一些想法:
我使用散列分区器将配置单元表划分为26个分区。这是基于有26个不同值的列值。我希望在for循环中执行的操作可以通用化,这样它只需要在每个分区上执行。
也就是说,我怎样才能在线编写scala代码来实现这一点,以及让一个单独的执行器在每个分区上执行这些循环,或者我可以在线查看什么指南?我想这会让事情变得更快。
我知道如何使用多线程执行类似的操作,但不知道如何在scala/spark范例中执行。您能解决这个问题吗?我正在尝试解决类似的问题,所以如果你能解决这个问题,任何建议都会有帮助吗?我正试图解决类似的问题,所以任何建议都会有所帮助