[英]groupBykey in spark
这是Spark的新功能,我正在尝试在Spark中读取管道分隔文件。 我的文件如下所示:
user1|acct01|A|Fairfax|VA
user1|acct02|B|Gettysburg|PA
user1|acct03|C|York|PA
user2|acct21|A|Reston|VA
user2|acct42|C|Fairfax|VA
user3|acct66|A|Reston|VA
我在scala中执行以下操作:
scala> case class Accounts (usr: String, acct: String, prodCd: String, city: String, state: String)
defined class Accounts
scala> val accts = sc.textFile("accts.csv").map(_.split("|")).map(
| a => (a(0), Accounts(a(0), a(1), a(2), a(3), a(4)))
| )
然后,我尝试按键对键值对进行分组,这不确定我是否执行的正确...这是我的工作方式吗?
scala> accts.groupByKey(2)
res0: org.apache.spark.rdd.RDD[(String, Iterable[Accounts])] = ShuffledRDD[4] at groupByKey at <console>:26
我以为(2)是要给我前两个结果,但我似乎并没有从控制台得到任何东西...
如果我跑一个独特的...我也明白这一点。
scala> accts.distinct(1).collect(1)
<console>:26: error: type mismatch;
found : Int(1)
required: PartialFunction[(String, Accounts),?]
accts.distinct(1).collect(1)
编辑:本质上,我试图获得一个键值对嵌套映射。 例如,user1看起来像这样:
user1 | {'acct01': {prdCd: 'A', city: 'Fairfax', state: 'VA'}, 'acct02': {prdCd: 'B', city: 'Gettysburg', state: 'PA'}, 'acct03': {prdCd: 'C', city: 'York', state: 'PA'}}
试图一步一步地学习这一点,以为我会将其分解成小块以便理解...
我认为,如果您已经完成了定义架构的过程,那么将数据放入DataFrame可能会更好。 首先,您需要修改拆分注释以使用单引号。 (请参阅此问题 )。 另外,您可以在一开始就摆脱a(0)
。 然后,转换为DataFrame是微不足道的。 (请注意,DataFrames在spark 1.3+上可用。)
val accts = sc.textFile("/tmp/accts.csv").map(_.split('|')).map(a => Accounts(a(0), a(1), a(2), a(3), a(4)))
val df = accts.toDF()
现在df.show
产生:
+-----+------+------+----------+-----+
| usr| acct|prodCd| city|state|
+-----+------+------+----------+-----+
|user1|acct01| A| Fairfax| VA|
|user1|acct02| B|Gettysburg| PA|
|user1|acct03| C| York| PA|
|user2|acct21| A| Reston| VA|
|user2|acct42| C| Fairfax| VA|
|user3|acct66| A| Reston| VA|
+-----+------+------+----------+-----+
您应该更容易使用数据。 例如,要获取唯一用户列表:
df.select("usr").distinct.collect()
产生
res42: Array[org.apache.spark.sql.Row] = Array([user1], [user2], [user3])
有关更多详细信息,请查看docs 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.