Scala RDD操作

时间:2017-03-22 21:04:11

标签: scala apache-spark rdd

我是斯卡拉的新人。

我有一个存储在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执行这些操作。

2 个答案:

答案 0 :(得分:1)

<强>折扣

case class Transaction(cId: Int, tId: Int, itemId: Int, itemPrice: Int)
  1. val salesdata:RDD [String] =&gt;映射RDD,在映射中用分隔符分割行,然后将Array转换为一个名为Transaction calling Array(i).toInt的case类来转换字段。在此步骤中,您的目标是获得RDD [交易]。
  2. 再次映射RDD并使用折扣复制您的交易(t =&gt; t.copy(itemPrice = 0.7 * t.itemPrice))
  3. 您将有一个新的RDD [交易]
  4. 明智的客户

    1. 取最后一个对象,应用keyBy(_。cId)获取RDD [Int,Transaction],其中您的密钥是客户端。
    2. 按键减少添加每个项目的价格。目标=&gt; RDD [Int,Int],您可以获得每个客户的总数。
    3. 找到目标客户!

答案 1 :(得分:0)

由于您需要更多指南,让我们在Spark之外看一下这一点,并将其视为典型的Scala集合。

您的数据如下所示:

val data = Array(
        (5, 199, 5, 100),
        (33, 235, 5, 100),
...
)

我认为您可以使用salesdata或正则表达式等将Array RDD字符串映射到Tuple4split的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

PairRDDmapValues都有一个cIds函数,它允许我在转换每个元组集合时保留键(min)。在这种情况下,我只需通过获取每个元组中的第4个项目(折扣价格)将集合映射到折扣价格的集合。然后我在该集合上调用maxMap并返回这些值的元组。

因此,结果是display: flex;客户ID到折扣价格的最小值和最大值的元组。 RDD API的优点在于它如此紧密地遵循传统的Scala集合API,因此它基本上是相同的。