繁体   English   中英

火花中的groupBykey

[英]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

3个发现可以帮助您理解问题:

1) groupByKey(2)不返回前2个结果,参数2用作结果RDD的分区数。 参见docs

2) collect不带Int参数。 参见docs

3) split接受两种类型的参数, CharString 字符串版本使用正则表达式,因此"|" 如果需要原义,则需要转义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM