【问题标题】:How to extract values from an RDD based on the parameter passed如何根据传递的参数从 RDD 中提取值
【发布时间】:2018-05-29 18:50:10
【问题描述】:

我已经创建了一个键值 RDD,但我不确定如何从中选择值。

val mapdf = merchantData_df.rdd.map(row => {
    val Merchant_Name = row.getString(0)
    val Display_Name = row.getString(1)
    val Store_ID_name = row.getString(2)
    val jsonString = s"{Display_Name: $Display_Name, Store_ID_name: $Store_ID_name}"
    (Merchant_Name, jsonString)
})

scala> mapdf.take(4).foreach(println)
(Amul,{Display_Name: Amul, Store_ID_name: null})
(Nestle,{Display_Name: Nestle, Store_ID_name: null})
(Ace,{Display_Name: Ace , Store_ID_name: null})
(Acme ,{Display_Name: Acme Fresh Market, Store_ID_name: Acme Markets})

现在假设我的函数输入字符串是Amul,我的预期输出是DisplayName is Amul,另一个函数是StoreID to return NULL

我怎样才能实现它?

我不想为此目的使用 SparkSQL

【问题讨论】:

  • 您能分享您的预期输出以及您尝试过的代码吗?
  • @RameshMaharjan 我现在已经更改了要求。你能帮帮我吗?
  • @RameshMaharjan 已更新。
  • @RameshMaharjan,再次更新问题
  • 可以通过简单的过滤和选择来完成。你试过吗?

标签: scala apache-spark


【解决方案1】:

给定输入数据框

+-----------------+-----------------+-------------+
|Merchant_Name    |Display_Name     |Store_ID_name|
+-----------------+-----------------+-------------+
|Fitch            |Fitch            |null         |
|Kids             |Kids             |null         |
|Ace Hardware     |Ace Hardware     |null         |
| Fresh Market    |Acme  Market     |Acme Markets |
|Adventure        | Island          |null         |
+-----------------+-----------------+-------------+

你可以写一个带有字符串参数的函数

import org.apache.spark.sql.functions._
def filterRowsWithKey(key: String) = df.filter(col("Merchant_Name") === key).select("Display_Name", "Store_ID_name")

并将函数调用为

filterRowsWithKey("Fitch").show(false)

会给你

+------------+-------------+
|Display_Name|Store_ID_name|
+------------+-------------+
|Fitch       |null         |
+------------+-------------+

希望回答对你有帮助

更新

如果您希望从函数返回第一行作为字符串,那么您可以这样做

import org.apache.spark.sql.functions._
def filterRowsWithKey(key: String) = df.filter(col("Merchant_Name") === key).select("Display_Name", "Store_ID_name").first().mkString(",")

println(filterRowsWithKey("Fitch"))

这应该给你

Fitch,null

如果没有找到传递的密钥,上面的函数会抛出异常,所以为了安全起见,你可以使用下面的函数

import org.apache.spark.sql.functions._
def filterRowsWithKey(key: String) = {
  val filteredDF = df.filter(col("Merchant_Name") === key).select("Display_Name", "Store_ID_name")
  if(filteredDF.count() > 0) filteredDF.first().mkString(",") else "key not found"
}

【讨论】:

  • 感谢 Ramesh,但我已经做了同样的事情,而且性能真的很慢。这就是为什么我正在寻找其他替代方案。
  • 我怎样才能把它变成 UDF?
  • 你为什么想要一个 udf?
  • UDF 背后没有任何真正的原因,但我只是在想,顺便说一下,我怎样才能从函数 filterRowsWithKey 获取输出作为字符串而不是 DF?
  • 我尝试将值作为字符串返回,但出现以下错误。 scala> def get_PanelName(key: String) :String = { input_df.filter(col("Merchant_Name") === key).select("Display_Name") } <console>:39: error: type mismatch; found : org.apache.spark.sql.DataFrame (which expands to) org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] required: String def get_PanelName(key: String) :String = { input_df.filter(col("Merchant_Name") === key).select("Display_Name") }
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 2015-08-11
  • 2017-07-06
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2016-09-22
相关资源
最近更新 更多