在Sparklyr中创建新Spark表或数据框的最有效方法是什么?

时间:2017-06-23 16:59:19

标签: hadoop apache-spark hive dplyr sparklyr

在Hadoop集群(不是VM)上使用sparklyr包,我正在处理需要加入,过滤等的几种类型的表...我正在尝试确定什么将dplyr命令与sparklyr中的数据管理函数一起使用以运行处理,将其存储在缓存中,并使用中间数据对象生成保留的下游对象是最有效的方法缓存。这个问题是肤浅的,因为它在上面提出,但我希望得到更多的信息而不是纯粹的效率,所以如果你想编辑我的问题,我就可以了......

我在Hive中有一些表格,我们称之为Activity2016Accounts2016Accounts2017。 “帐户”表还包括地址历史记录。我想从2016年数据开始合并名称和现有地址上的两个表格,过滤一些活动和帐户详细信息,然后将两种不同的方式与2017年帐户信息合并,特别是计算留在他们地址的人数与那些谁改变了地址。我们有数百万行,所以我们正在使用我们的spark集群进行此活动。

所以,首先,这就是我现在正在做的事情:

sc <- spark_connect()    

Activity2016 %>% filter(COL1 < Cut1 & COL1 > Cut2) %>% 
select(NAME,ADDRESS1) %>% 
inner_join(Accounts2016,c("NAME"="NAME","ADDRESS1"="ADDRESS1")) %>%
distinct(NAME,ADDRESS1) %>% sdf_register("JOIN2016")

tbl_cache(sc,"JOIN2016")
JOINED_2016 <- tbl(sc, "JOIN2016")

Acct2017 = tbl(sc, "HiveDB.Accounts2017")

# Now, I can run:
JOINED_2016 %>% inner_join(Acct2017,c("NAME"="NAME","ADDRESS1"="ADDRESS2")) %>%
distinct(NAME,ADDRESS1.x) %>% sdf_register("JOIN2017")

# Rinse & Repeat
tbl_cache(sc,"JOIN2017")
JOINED_2017 <- tbl(sc,"JOIN2017")

然后我继续使用JOINED_2016JOINED_2017,使用dplyr动词等...

这里似乎存在多种低效率......比如, 1)我不应该直接将其发送到缓存并将其作为变量调用吗? 2)我不也可以直接将它发送到书面的Hive表中吗? 3)如何投射最终对象以运行R之类的基本table(JOINED_2016$COL1)命令,或者那些命令不可用(我在尝试%>% select(COL1) %>% table时遇到错误)?

如果出现下游错误并且我没有写出来,我将丢失数据......但我觉得关于如何编写我不清楚的数据的选择太多了。什么时候最终作为缓存对象,而不是RDD,而不是Hive内部/外部表,而不是Spark DataFrame,以及R对这些数据对象的处理能力有什么限制?

例如,如果我只是运行:

JOIN2016 <- Activity2016 %>% filter(COL1 < Cut1 & COL1 > Cut2) %>% 
select(NAME,ADDRESS1) %>% 
inner_join(Accounts2016,c("NAME"="NAME","ADDRESS1"="ADDRESS1")) %>%
distinct(NAME,ADDRESS1) 

这会是R data.frame吗? (这可能会导致我的网关节点的RAM崩溃......这就是为什么我不愿意尝试它。这是业务中的集群)

总结: 我是否应该完全使用tbltbl_cache命令,还是需要它们?

我应该使用dbWriteTable吗?我可以在sdf_register之后,之前或之后直接执行此操作...或者我可以在写之前使用tbl命令什么东西到蜂巢? sdf_register似乎毫无意义。

我应该使用copy_to还是db_copy_to代替dbWriteTable?我不想把Hive变成倾销场,所以我要小心如何编写中间数据,然后在存储它之后对R如何使用它保持一致。

我必须运行哪些data.frame - 类型来处理数据,就像它是内存中的R对象一样,还是仅限于dplyr命令?

对不起,这个问题有很多,但我不认为R-bloggers文章,sparklyr教程中的这些问题是否清晰,还有关于SOF的其他问题。

1 个答案:

答案 0 :(得分:2)

处理长时间运行的查询时,

sdf_register不是很有用。它基本上是一个非物质化的视图,这意味着每次调用它时都会运行基础查询。添加以下内容会将数据作为表写入Hive。

spark_dataframe %>% invoke("write") %>% invoke("saveAsTable", as.character("your_desired_table_name"))

这使用saveAsTable作为表,它将在has中创建一个表,并在Spark会话结束后保留​​该表。 Spark会话结束时,使用createOrReplaceTempView不会保留数据。