Scala编程中常见错误:Error:(24, 29) value foreach is not a member of java.util.Set[String]

本文详细介绍了在Scala编程中遇到的关于集合操作的常见错误,特别是当尝试使用Java集合的foreach方法时出现的类型不匹配问题。通过引入Scala的JavaConversions隐式转换,可以轻松解决此问题,确保代码正确运行。
问题:
在Scala编程开发中, 经常会出现类似如下的错误,
Error:(24, 29) value foreach is not a member of java.util.Set[String]
    for (key <- reducedList.keySet) {
                            ^

Error:(21, 22) value filter is not a member of java.util.ArrayList[myakka.messages.Word]
    for (wc: Word <- dataList) {
                     ^
解决方法:
因为reducedList是java.util.HashMap, 没有foreach方法, 所以需要将其转换为Scala的集合类型, 
因此需要在代码中加入如下内容(Scala支持与Java的隐式转换),
import scala.collection.JavaConversions._  
这是第二篇package cn.yx56.cm import java.time.LocalDate import java.util.UUID import cn.yx56.Share.utils.config.{DBUtil, DateUtil, OnlineResourceURL, PropDbPass, SparkInit} import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession} import cn.yx56.Share.utils.KuduTools.KuduHelper._ import cn.yx56.cm.MemberManageBaseInfo.{oracleProPw, oracleProUser} import org.apache.spark.rdd.RDD import scala.collection.mutable /** * * @description: 计算会员积分(翻译后台代码) * @author: wtl * @create: 2020-05-22 **/ object MemberPointInfo extends OnlineResourceURL { def main(args: Array[String]): Unit = { val sparkSession: SparkSession = SparkInit.Init("local[*]", "memberPointInfo") import sparkSession.implicits._ /*三天前的日期*/ val orderDate: String = DateUtil.getAddTime(LocalDate.now().toString, -3, "d") val minorderDate: String = "2025-02-04" println(orderDate) /*会员表 会员卡号 当前积分 累计积分*/ val memberDf: DataFrame = sparkSession.readKuduTable("B_MEMBER_ODS") .selectExpr("MEMBERCA01 MEMBER_CARD", "MEMBERCA13 CUR_POINT", "MEMBERCA17 TOTAL_POINT", "LAST_BP_BALANCE") memberDf.createTempView("member_temp") /*查询3天前签收的运单数据 避免受'反签收'业务的影响*/ val orderDf: Dataset[Row] = sparkSession.readKuduTable("T_ORDER_CTL_ODS") .filter("SIGN_TIME>='" + orderDate + " 00:00:00' and SIGN_TIME<='" + orderDate + " 23:59:59' and ORDER_STATUS=3 and (SHIPPER_VIP_NUM is not null or CONSIGNEE_VIP_NUM is not null)") .select("ORDER_ID", "SHIPPER_VIP_NUM", "CONSIGNEE_VIP_NUM") orderDf.createTempView("order_temp") /*运单费用表 只取运费数据 同样筛选出三天前的数据*/ val orderFeeDf: DataFrame = sparkSession.readKuduTable("T_ORDER_FEE_ODS") .filter("FEE_TYPE=0") .select("ORDER_ID", "PLAN_FEE", "PAY_SIDE") orderFeeDf.createTempView("order_fee_temp") /*运单支付表*/ sparkSession.readKuduTable("T_ORDER_PAY_ODS") .filter("PAY_TYPE=3") .select("ORDER_ID", "PAY_TYPE", "PAY_SIDE") .createTempView("order_pay_temp") /*区分发货人/收货人会员数据*/ val memberOrderDf: DataFrame = sparkSession.sql("select ORDER_ID,SHIPPER_VIP_NUM MEMBER_CARD,0 MEMBER_TYPE " + "from order_temp " + "where SHIPPER_VIP_NUM is not null " + "union all " + "select ORDER_ID,CONSIGNEE_VIP_NUM MEMBER_CARD,1 MEMBER_TYPE " + "from order_temp " + "where CONSIGNEE_VIP_NUM is not null") memberOrderDf.createTempView("member_order_temp") /*关联拿到运单费用以及支付方式 过滤掉发货会员合同付的数据(这种情况下不加积分)*/ val memberOrderFeeDf: DataFrame = sparkSession.sql("select t.*,f.PLAN_FEE PLAN_FEE,f.PAY_SIDE PAY_SIDE, " + "m.CUR_POINT CUR_POINT,m.TOTAL_POINT TOTAL_POINT,m.LAST_BP_BALANCE LAST_BP_BALANCE,if(p.PAY_TYPE is null,-1,p.PAY_TYPE) PAY_TYPE " + "from member_order_temp t join order_fee_temp f on t.order_id=f.order_id " + "join member_temp m on t.MEMBER_CARD=m.MEMBER_CARD " + "left join order_pay_temp p on t.order_id=p.order_id and f.PAY_SIDE=p.PAY_SIDE " + "where !(MEMBER_TYPE=0 and f.PAY_SIDE=2)") .filter(""" MEMBER_CARD = '0282834' """) memberOrderFeeDf.show(40,false) memberOrderFeeDf.printSchema() // memberOrderFeeDf.createOrReplaceTempView("temp_a") /* sparkSession.sql(" select * " + "from temp_a " + // "where MEMBER_CARD = 0152182 " + " ").show() */ /** * root * |-- ORDER_ID: long (nullable = false) 0 * |-- MEMBER_CARD: string (nullable = true) 1 * |-- MEMBER_TYPE: integer (nullable = false) 2 * |-- PLAN_FEE: double (nullable = false) 3 * |-- PAY_SIDE: byte (nullable = false) 4 * |-- CUR_POINT: double (nullable = true) 5 * |-- TOTAL_POINT: double (nullable = true) 6 * |-- LAST_BP_BALANCE: double (nullable = false) 7 * |-- PAY_TYPE: integer (nullable = true) 8 */ val resultRdd: RDD[String] = memberOrderFeeDf.rdd .map(x => (x.getString(1), (x.getString(0), x.getInt(2), x.getDouble(3), x.getByte(4), x.getDouble(5), x.getDouble(6), x.getDouble(7), x.getInt(8)))) .groupByKey() .flatMap(x => { val sqlList: mutable.MutableList[String] = mutable.MutableList[String]() //会员当前积分 var curPointUpdate: Double = 0.0 //会员累计积分 var totalPointUpdate: Double = 0.0 val list: List[(String, Int, Double, Byte, Double, Double, Double, Int)] = x._2.toList for (i <- list) { //运单ID // val orderId: String = i._1 //会员发货类型(0:发货,1:收货) val memberType: Int = i._2 //运费 var fee: Double = i._3 //付款方(0:交付,1:提付,2:合同付) val paySide: Byte = i._4 //会员当前积分 var curPoint: Double = i._5 //会员累计积分 var totalPoint: Double = i._6 //上年积分 val lastBpBalance: Double = i._7 //支付类型 val payType: Int = i._8 //运费积分 var feePoint: Double = 0 var payDesc: String = "" //如果是发货会员 if (memberType == 0) { //交付 if (paySide == 0) { if (fee > 100) { fee = (fee - 100) / 5 + 100 } if (payType == 3) { //如果运费大于500 最多只能加500积分 if (fee * 1.5 > 500) { feePoint = 500 } else { feePoint = fee * 1.5 } } else { //如果运费大于500 最多只能加500积分 if (fee > 500) { feePoint = 500 } else { feePoint = fee } } payDesc = "交付,付款人" } else { //到付 //最多只能加100积分 if (fee / 5 > 100) { feePoint = 100 } else { feePoint = fee / 5 } payDesc = "提付,非付款人" } } else { //收货会员 //交付 if (paySide == 0) { //最多只能加100积分 if (fee / 5 > 100) { feePoint = 100 } else { feePoint = fee / 5 } payDesc = "交付,非付款人" } else if (paySide == 1) { if (fee > 100) { fee = (fee - 100) / 5 + 100 } //提付 if (payType == 3) { //如果运费大于500 最多只能加500积分 if (fee * 1.5 > 500) { feePoint = 500 } else { feePoint = fee * 1.5 } } else { //如果运费大于500 最多只能加500积分 if (fee > 500) { feePoint = 500 } else { feePoint = fee } } payDesc = "提付,付款人" } else { //合同付 //如果运费大于500 最多只能加500积分 if (fee / 5 > 100) { feePoint = 100 } else { feePoint = fee / 5 } payDesc = "合同付,非付款人" } } //取整 feePoint = Math.ceil(feePoint) //获取昨天历史当前积分余额 if (curPointUpdate == 0.0) { curPointUpdate = curPoint curPointUpdate += feePoint totalPointUpdate = totalPoint totalPointUpdate += feePoint } else { curPointUpdate += feePoint totalPointUpdate += feePoint } sqlList += "insert into B_MEMBER_BP_FLOW(ID,MEMBER_NO,VALUE,TYPE,REMARK,BALANCE,FLAG,LAST_BP_BALANCE,SERVICE_ID)values('" + UUID.randomUUID().toString + "','" + x._1 + "'," + feePoint + ",1,'" + payDesc + "'," + curPointUpdate + ",1," + lastBpBalance + ",'" + orderId + "')" // sqlList += "insert into B_MEMBER_BP_FLOW(ID)values('" + UUID.randomUUID() + "')" // println(sqlList) // sqlList += "会员号 '"+ x._1 +"',付款方(0:交付,1:提付,2:合同付) '"+ paySide + "' , 注释 '"+ payDesc +"', '"+ orderId +"',会员当前积分 '"+ curPointUpdate +"',运费积分 '"+ feePoint +"',支付类型 '"+ payType +"',会员当前积分 '"+ curPoint +"',运费 '"+ fee +"',会员累计积分 '"+ totalPoint +"',会员发货类型 '"+memberType+"'" } sqlList += "update B_MEMBER set MEMBERCA13=" + curPointUpdate + ",MEMBERCA17=" + totalPointUpdate + " where MEMBERCA01='" + x._1 + "'" sqlList }) resultRdd.foreach(println(_)) // resultRdd.foreachPartition(x=>println(x)) // resultRdd.foreachPartition(x => DBUtil.sparkBatchSql(x.toList, 5000, oracleDriver, oracleProUrl, PropDbPass.getEncryptor().decrypt(oracleProUser), PropDbPass.getEncryptor().decrypt(oracleProPw))) // resultRdd.foreachPartition(x => DBUtil.sparkBatchSql(x.toList, 5000, oracleDriver, oracleDwUrl,oracleDwDomeUser, oracleDwDuPw)) sparkSession.stop() } }
最新发布
12-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值