我是斯卡拉的新人。
我有一个存储在hdfs中的csv文件。我正在使用
在scala中读取该文件 val salesdata = sc.textFile("hdfs://localhost:9000/home/jayshree/sales.csv")
以下是一小部分数据" sales"。
C_ID T_ID ITEM_ID ITEM_Price
5 199 1 500
33 235 1 500
20 249 3 749
35 36 4 757
19 201 4 757
17 94 5 763
39 146 5 763
42 162 5 763
49 41 6 824
3 70 6 824
24 161 6 824
48 216 6 824
我必须对它执行以下操作。
1.对每个项目应用一些折扣,在列d(itemprice)上假设30%的折扣。公式为d = d-(30%(d))。
2.对每件商品征收30%折扣后,找出客户明智的最小和最大商品价值。
我试图将30与ITEM_Price列的观察结果相乘。问题是d的值被视为字符串。当我在结果中乘以数字时,它会显示很多次的值。喜欢(500 * 3 = 500500500)
我可以将其转换为数据框并执行此操作。但我只是想知道,如果不将其转换为数据帧,我们可以为RDD执行这些操作。
答案 0 :(得分:1)
<强>折扣强>
case class Transaction(cId: Int, tId: Int, itemId: Int, itemPrice: Int)
明智的客户
答案 1 :(得分:0)
由于您需要更多指南,让我们在Spark之外看一下这一点,并将其视为典型的Scala集合。
您的数据如下所示:
val data = Array(
(5, 199, 5, 100),
(33, 235, 5, 100),
...
)
我认为您可以使用salesdata
或正则表达式等将Array
RDD字符串映射到Tuple4
或split
的RDD。
让我们去一个元组。然后你可以这样做:
data.map {
case (cId, tId, item, price) => (cId, tId, item, price * .7)
}
将元组的原始RDD映射到元组的另一个RDD,其中最后一个值(价格)减少了30%。结果是Tuple4[Int, Int, Int, Double]
。
老实说,我不知道你的意思是客户明智的最小和最大,但也许是这样的:
data.map {
case (cId, tId, item, price) => (cId, tId, item, price * .7)
}.groupBy(_._1)
.mapValues { tuples =>
val discountedPrices = tuples.map(_._4)
(discountedPrices.min, discountedPrices.max)
}
首先,我执行groupBy
,从Map
(元组中的第一个值,解释cId
)生成._1
到完整的集合元组 - Map
cId
cId
个集合与PairRDD
相关的行。在Spark中,这将产生Map
。
PairRDD
和mapValues
都有一个cIds
函数,它允许我在转换每个元组集合时保留键(min
)。在这种情况下,我只需通过获取每个元组中的第4个项目(折扣价格)将集合映射到折扣价格的集合。然后我在该集合上调用max
和Map
并返回这些值的元组。
因此,结果是display: flex;
客户ID到折扣价格的最小值和最大值的元组。 RDD API的优点在于它如此紧密地遵循传统的Scala集合API,因此它基本上是相同的。