MySQL {term}.format(term=terms)解决筛选问题

本文探讨了在数据库查询中如何实现针对'其他'类别的操作系统搜索,即排除已知类型的如CentOS、Ubuntu等,通过使用SQL的INSTR函数结合逻辑运算符实现了对'其他'操作系统的有效筛选。
问题:数据表中某一字段(假设为os)的存值是各个主机的操作系统,现在想在页面中归纳操作系统,并根据归纳后的操作系统类别进行搜索,搜索项有“CentOS”、“Ubuntu”、“RedHat”、“SUSE”、“其他”,“所有”,对应的前端设计传值为“CentOS”、“Ubuntu”、“RedHat”、“SUSE”,“others”,“”
 
 
数据库数据内容:
mysql> select hostname,os from hosts group by deviceid;
+-----------------------+--------------------------------------------------------+
| hostname              | os                                                     |
+-----------------------+--------------------------------------------------------+
| redhat6.2             | Red Hat Enterprise Linux Server release 6.2 (Santiago) |
| redhat7.3             | Red Hat Enterprise Linux Server release 7.3 (Maipo)    |
| SyslogVM              | Cyber Threat Deep Investigation 2.3.1498               |
| centos6.0             | CentOS Linux release 6.0 (Final)                       |
| localhost.localdomain | CentOS Linux release 7.3.1611 (Core)                   |
+-----------------------+--------------------------------------------------------+
5 rows in set (0.00 sec)

 

当下拉框搜索“CentOS”、“Ubuntu”、“RedHat”、“SUSE”时很简单,直接where INSTR(os,"CentOS"),当搜索“所有”时,可以where INSTR(os,'')
 
但搜索“其他”,该怎样解决呢???
if sysos == "others":
    terms = "not (INSTR(h.os,'Red Hat') or INSTR(h.os,'CentOS') or INSTR(h.os,'Ubuntu') or INSTR(h.os,'SUSE'))"
else:
    terms ="INSTR(h.os,'{item}')".format(item=sysos)
 
 
SQL = "where {term}".format(term=terms)
 
以上发的报错是这段代码的报错package com; import org.ansj.domain.Result; import org.ansj.domain.Term; import org.ansj.splitWord.analysis.ToAnalysis; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.RowFactory; import org.apache.spark.sql.SparkSession; import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructField; import org.apache.spark.sql.types.StructType; import scala.Tuple2; import java.util.ArrayList; import java.util.List; public class EduSkillOptimized { public static void main(String[] args) { // 1. SparkSession配置优化 SparkSession spark = SparkSession.builder() .appName("SkillAnalysis") .master("local[*]") // 使用所有可用核心 .config("spark.sql.shuffle.partitions", "4") // 控制shuffle分区数 .config("spark.executor.memory", "2g") // 调整执行器内存 .getOrCreate(); spark.sparkContext().setLogLevel("WARN"); /********** 核心优化部分 **********/ try { // 2. 数据读取优化 Dataset<Row> data = spark.read() .parquet("/root/files/data.parquet") .select("responsibility"); // 提前过滤字段 // 3. 分词处理优化 JavaRDD<String> words = data.javaRDD() .flatMap(row -> { String text = row.getString(0); if (text == null || text.trim().isEmpty()) { return new ArrayList<String>().iterator(); } // 增加异常处理 try { Result result = ToAnalysis.parse(text); List<Term> terms = result.getTerms(); List<String> enWords = new ArrayList<>(terms.size()); for (Term term : terms) { if ("en".equals(term.getNatureStr())) { String word = term.getName() .toLowerCase() .trim(); // 增加有效词过滤 if (word.length() >= 2 && !word.matches(".*\\d.*")) { enWords.add(word); } } } return enWords.iterator(); } catch (Exception e) { System.err.println("分词异常: " + e.getMessage()); return new ArrayList<String>().iterator(); } }) .filter(word -> word != null && !word.isEmpty()); // 4. 词频统计优化 JavaPairRDD<String, Integer> wordCounts = words .mapToPair(word -> new Tuple2<>(word, 1)) .reduceByKey((a, b) -> a + b) .coalesce(4); // 合并分区提高写入效率 // 5. 数据转换优化 StructType schema = new StructType(new StructField[]{ DataTypes.createStructField("skill", DataTypes.StringType, false), DataTypes.createStructField("count", DataTypes.IntegerType, false) // 修正字段名 }); Dataset<Row> resultDF = spark.createDataFrame( wordCounts.map(tuple -> RowFactory.create(tuple._1(), tuple._2())), schema ).persist(); // 持久化避免重复计算 // 6. 数据库写入优化 resultDF.write() .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/edudb?rewriteBatchedStatements=true") // 批量写入 .option("dbtable", "eduskill") .option("user", "root") .option("password", "secure_password") // 使用安全密码 .option("batchsize", "10000") // 批量提交大小 .mode("overwrite") .save(); // 7. 资源释放优化 resultDF.unpersist(); } catch (Exception e) { System.err.println("主程序异常: " + e.getMessage()); e.printStackTrace(); } finally { spark.stop(); } } }
最新发布
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值