在Hadoop集群(不是VM)上使用sparklyr
包,我正在处理需要加入,过滤等的几种类型的表...我正在尝试确定什么将dplyr
命令与sparklyr
中的数据管理函数一起使用以运行处理,将其存储在缓存中,并使用中间数据对象生成保留的下游对象是最有效的方法缓存。这个问题是肤浅的,因为它在上面提出,但我希望得到更多的信息而不是纯粹的效率,所以如果你想编辑我的问题,我就可以了......
我在Hive中有一些表格,我们称之为Activity2016
,Accounts2016
和Accounts2017
。 “帐户”表还包括地址历史记录。我想从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_2016
和JOINED_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崩溃......这就是为什么我不愿意尝试它。这是业务中的集群)
总结:
我是否应该完全使用tbl
和tbl_cache
命令,还是需要它们?
我应该使用dbWriteTable
吗?我可以在sdf_register
之后,之前或之后直接执行此操作...或者我可以在写之前使用tbl
命令什么东西到蜂巢? sdf_register
似乎毫无意义。
我应该使用copy_to
还是db_copy_to
代替dbWriteTable
?我不想把Hive变成倾销场,所以我要小心如何编写中间数据,然后在存储它之后对R如何使用它保持一致。
我必须运行哪些data.frame
- 类型来处理数据,就像它是内存中的R对象一样,还是仅限于dplyr
命令?
对不起,这个问题有很多,但我不认为R-bloggers文章,sparklyr
教程中的这些问题是否清晰,还有关于SOF的其他问题。
答案 0 :(得分:2)
sdf_register
不是很有用。它基本上是一个非物质化的视图,这意味着每次调用它时都会运行基础查询。添加以下内容会将数据作为表写入Hive。
spark_dataframe %>% invoke("write") %>% invoke("saveAsTable", as.character("your_desired_table_name"))
这使用saveAsTable
作为表,它将在has中创建一个表,并在Spark会话结束后保留该表。 Spark会话结束时,使用createOrReplaceTempView
不会保留数据。