繁体   English   中英

如何在 udf 中使用 dataframe 并解析 spark scala 中的数据

[英]How to use dataframe inside an udf and parse the data in spark scala

我是 scala 和火花的新手。 我需要使用 udf 创建新的 dataframe。 我有 2 个数据框,其中一个包含 3 列,即公司、ID 和类型。 df2 包含 2 列,即公司和消息。 df2 JSON 会这样

{"company": "Honda", "message": ["19:[\"cost 500k\"],[\"colour blue\"]","20:[\"cost 600k\"],[\"colour white\"]"]}
{"company": "BMW", "message": ["19:[\"cost 1500k\"],[\"colour blue\"]"]}

df2 将是这样的:

+-------+--------------------+
|company|             message|
+-------+--------------------+
|  Honda|[19:["cost 500k"]...|
|    BMW|[19:["cost 1500k"...|
+-------+--------------------+
 |-- company: string (nullable = true)
 |-- message: array (nullable = true)
 |    |-- element: string (containsNull = true)

df1 将是这样的:

+----------+---+-------+
|company   | id|   name|
+----------+---+-------+
|  Honda   | 19| city  |
|  Honda   | 20| amaze |
|  BMW     | 19| x1    |
+----------+---+-------+

我想通过将 df2 中的 id 替换为 df1 中的名称来创建一个新的数据框。

["city:[\"cost 500k\"],[\"colour blue\"]","amaze:[\"cost 600k\"],[\"colour white\"]"]

我曾尝试通过将消息作为 Seq[String] 和公司传递来使用 udf,但我无法 select df1 中的数据。
我想要这样的 output:

+-------+----------------------+
|company|             message  |
+-------+----------------------+
|  Honda|[city:["cost 500k"]...|
|    BMW|[x1:["cost 1500k"...  |
+-------+----------------------+

我尝试使用休闲 udf,但在选择名称时遇到错误

def asdf(categories: Seq[String]):String={
     | var data=""
     | for(w<-categories){
     | if (w != null){
     | var id=w.toString().indexOf(":")
     | var namea=df1.select("name").where($"id" === 20).map(_.getString(0)).collect()
     | var name=namea(0)
     | println(name)
     | var ids=w.toString().substring(0,id)
     | var li=w.toString().replace(ids,name)
     | println(li)
     | data=data+li
     | }
     | }
     | data
     | }

请检查以下代码。

scala> df1.show(false)
+-------+---------------------------------------------------------------------+
|company|message                                                              |
+-------+---------------------------------------------------------------------+
|Honda  |[19:["cost 500k"],["colour blue"], 20:["cost 600k"],["colour white"]]|
|BMW    |[19:["cost 1500k"],["colour blue"]]                                  |
+-------+---------------------------------------------------------------------+
scala> df2.show(false)
+-------+---+-----+
|company|id |name |
+-------+---+-----+
|Honda  | 19|city |
|Honda  | 20|amaze|
|BMW    | 19|x1   |
+-------+---+-----+
val replaceFirst = udf((message: String,id:String,name:String) => 
  if(message.contains(s"""${id}:""")) message.replaceFirst(s"""${id}:""",s"${name}:") else ""
)
val jdf = 
df1
.withColumn("message",explode($"message"))
.join(df2,df1("company") === df2("company"),"inner")
.withColumn(
    "message_data",
    replaceFirst($"message",trim($"id"),$"name")
)
.filter($"message_data" =!= "")

scala> jdf.show(false)

+-------+---------------------------------+-------+---+-----+------------------------------------+
|company|message                          |company|id |name |message_data                        |
+-------+---------------------------------+-------+---+-----+------------------------------------+
|Honda  |19:["cost 500k"],["colour blue"] |Honda  | 19|city |city:["cost 500k"],["colour blue"]  |
|Honda  |20:["cost 600k"],["colour white"]|Honda  | 20|amaze|amaze:["cost 600k"],["colour white"]|
|BMW    |19:["cost 1500k"],["colour blue"]|BMW    | 19|x1   |x1:["cost 1500k"],["colour blue"]   |
+-------+---------------------------------+-------+---+-----+------------------------------------+

scala> df1.join(df2,df1("company") === df2("company"),"inner").select(df1("company"),df1("message"),df2("id"),df2("name")).withColumn("message",explode($"message")).withColumn("message",replaceFirst($"message",trim($"id"),$"name")).filter($"message" =!= "").groupBy($"company").agg(collect_list($"message").cast("string").as("message")).show(false)
+-------+--------------------------------------------------------------------------+
|company|message                                                                   |
+-------+--------------------------------------------------------------------------+
|Honda  |[amaze:["cost 600k"],["colour white"], city:["cost 500k"],["colour blue"]]|
|BMW    |[x1:["cost 1500k"],["colour blue"]]                                       |
+-------+--------------------------------------------------------------------------+

暂无
暂无

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

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