嗨,我正在尝试使用Scala将RDD数据加载到Cassandra Column系列。在总共50行中,只有28行存储在cassandra表中。 以下是代码段:
val states = sc.textFile("state.txt")
//list o fall the 50 states of the USA
var n =0 // corrected to var
val statesRDD = states.map{a =>
n=n+1
(n, a)
}
阶> statesRDD.count res2:长= 50
cqlsh:BRS> CREATE TABLE BRS.state(state_id int PRIMARY KEY,state_name text);
statesRDD.saveToCassandra(“brs”,“state”,SomeColumns(“state_id”,“state_name”)) //此语句仅保存50行中的28行,不确定原因!!!!
cqlsh:brs> select * from state;
state_id | state_name
----------+-------------
23 | Minnesota
5 | California
28 | Nevada
10 | Georgia
16 | Kansas
13 | Illinois
11 | Hawaii
1 | Alabama
19 | Maine
8 | Oklahoma
2 | Alaska
4 | New York
18 | Virginia
15 | Iowa
22 | Wyoming
27 | Nebraska
20 | Maryland
7 | Ohio
6 | Colorado
9 | Florida
14 | Indiana
26 | Montana
21 | Wisconsin
17 | Vermont
24 | Mississippi
25 | Missouri
12 | Idaho
3 | Arizona
(28 rows)
任何人都可以帮我找到问题所在吗?
修改
我理解为什么在Cassandra中只存储了28行,这是因为我将第一列设为PRIMARY KEY,看起来在我的代码中,n最多增加到28,然后再从1到22再次启动(总计50)。
val states = sc.textFile("states.txt")
var n =0
var statesRDD = states.map{a =>
n+=1
(n, a)
}
我尝试将n作为累加器变量(即val n = sc.accumulator(0,“Counter”)),但我没有看到输出有任何差异。 < / p>
阶&GT; statesRDD.foreach(的println) [第2阶段:&gt; (0 + 0)/ 2] (1,新罕布什尔州) (2,新泽西州) (3,新墨西哥州) (4,纽约) (5,北卡罗来纳州) (6,北达科他州) (7,俄亥俄) (8,俄克拉何马州) (9,俄勒冈州) (10,宾夕法尼亚州) (11,罗德岛州) (12,南卡罗来纳州) (13,南达科他州) (14,田纳西州) (15日,得克萨斯州) (16,犹他州)的 (17,佛蒙特州) (18,弗吉尼亚州) (19日,华盛顿) (20,西弗吉尼亚州) (21,威斯康星州) (22,怀俄明州) (1,阿拉巴马州) (2,阿拉斯加) (3,亚利桑那州) (4,阿肯色州) (5,California)中 (6,科罗拉多州) (7,康涅狄格州) (8,特拉华州) (9,佛罗里达) (10,乔治亚州) (11,夏威夷) (12,爱达荷) (13,伊利诺斯州) (14,印第安纳州)的 (15,爱荷华州) (16,堪萨斯州) (17,肯塔基) (18,路易斯安那州) (19,缅因州)的 (20,马里兰州) (21,马萨诸塞州) (22,密歇根州) (23,明尼苏达州) (24,密西西比州) (25,密苏里州) (26,蒙大拿) (27,内布拉斯加州) (28,内华达)
我很想知道是什么导致n在值28之后没有更新?另外,我可以用什么方法创建一个可用于创建RDD的计数器?
答案 0 :(得分:0)
对于问题中嵌入的分布式系统存在一些误解。真正的核心是&#34;我如何在分布式系统中使用计数器?&#34;
简短的回答是你不是。例如,您在代码示例中最初所做的就是这样。
Task One {
var x = 0
record 1: x = 1
record 2: x = 2
}
Task Two {
var x = 0
record 20: x = 1
record 21: x = 2
}
每台机器独立创建一个设置为0的新x
变量,该变量在其自身的上下文中递增,独立于其他节点。
对于大多数用例,&#34;计数器&#34;问题可以替换为&#34;如何在分布式系统中获得每条记录的唯一标识符?&#34;
为此,大多数用户最终使用的UUID
可以在具有极小冲突机会的独立机器上生成。
如果问题可以&#34;我怎样才能获得单调增加的独特标识符?&#34;
然后你可以使用zipWithUniqueIndex
,它不会计算,但会产生单调增加的ID。
如果你只是希望他们以数字开头,那么最好在本地系统上进行。
累积器按任务存储状态(惊喜)。你可以用一个小例子看到这个:
val x = sc.accumulator(0, "x")
sc.parallelize(1 to 50).foreachPartition{ it => it.foreach(y => x+= 1); println(x)}
/*
6
7
6
6
6
6
6
7
*/
x.value
// res38: Int = 50
累加器在完成任务后结合其状态,这意味着您无法将它们用作全局分布式计数器。