scala - 在 Spark Scala 中将 RDD[(String, String, String)] 转换为 RDD[(String, (String, String))]
问题描述
有 2 个 rdds ,我正在尝试加入:当每个 rdd 中有 2 个参数时,它会加入,但是当我在现有GTINs rdd 中添加一个新参数时,我面临以下错误:
下面是代码:
newGTS.collect()
(00070137115045,00070137115045)
(00799999150451,00799999150451)
existingGTS.collect()
(00799999150451,(00003306-808b-46da-bc7f-419c5ae223a7,2016-10-10 10:23:12.0))
(00016700000653,(00006d79-94ea-4651-be0c-0ce77958cd45,2021-05-31 01:20:39.291))
(00923846453024,(0000704b-b40d-4b9e-b266-f7c66723df0e,null))
(00610074049265,(0000a7a1-587c-4b13-a155-7846df82fdee,2020-03-20 12:16:55.873))
(00034100516079,(0002495f-6084-49dd-aadb-20cd137d9694,null))
val join1 = newGTINs.leftOuterJoin(existingGTINs) mapValues {
case (gtin, iUUID, createDt) => (iUUID.isEmpty, iUUID.getOrElse(UUID.randomUUID.toString))
}
error: constructor cannot be instantiated to expected type;
found : (T1, T2, T3)
required: (String, Option[(String, String)])
case (gtin, iUUID, createDt) => (iUUID.isEmpty, iUUID.getOrElse(UUID.randomUUID.toString))
^
PS: UUID.randomUUID.toString --> 这个函数是创建一个随机id
解决方案
我在猜测,在 join 中使用的应该与collects相同newGTINs
并显示。existingGTINs
newGTS
existingGTS
既然你newGTSINs
看起来是 aRDD[(String, String)]
并且existingGTINS
是 a RDD[(String, (String, String))]
,那么你newGTINs.leftOuterJoin(existingGTINs)
将是 a RDD[(String,(String, Option[(String, String)]))]
。
这意味着您mapValues
将期望一个函数(String, Option[(String, String)]) => SomeNewType
或作为参数。它也可以接受满足相似类型语义的偏函数。
但是你{ case (gtin, iUUID, createDt) => (iUUID.isEmpty, iUUID.getOrElse(UUID.randomUUID.toString)) }
是一个对应于 type 的偏函数(String, String, String) => SomeNewType
。
注意差异,因此错误。您可以通过提供适当的部分函数来满足mapValues
要求来解决此问题。
val join1 =
newGTINs
.leftOuterJoin(existingGTINs)
.mapValues {
case (gtin, Some(iUUID, createDt)) =>
(iUUID.isEmpty, iUUID.getOrElse(UUID.randomUUID.toString))
case (gtin, None) =>
// what heppens for gtins without matching element in existing one's
(true, UUID.randomUUID.toString)
}
推荐阅读
- javascript - 车把使用变量作为#each 对象的一部分
- flutter - 如何在颤动中保存checkboxListTile
- javascript - 如何更新js中的嵌套对象数组?
- android - 与来自 ADB Shell 的 android 通知操作进行交互
- dictionary - 该任务包括一个带有未定义变量的选项。错误是:“ansible.utils.unsafe_proxy.AnsibleUnsafeText 对象”没有属性“数据”\n
- angularjs - 错误:formController 中的 [ng:cpws] 深度观察 - angularJS 1.8.0
- c++ - 原子之间的区别
和整数 - express - 从 .env 导入变量 - Express Cloud 函数 - 显示未定义
- c++ - 获取进程 c++ 使用的所有区域的列表
- angular - 角材料可拖动对话框不起作用