IEDA编写的 java SparkAPI 读取CSV文件,用spark sql简单处理结果并保存到MySQL数据库的代码实现

本文介绍如何使用Apache Spark从CSV文件中筛选特定数据,创建新的数据列,并将处理后的数据写入MySQL数据库。具体步骤包括读取CSV文件,过滤包含特定条件的行,根据数值比较生成状态标记,最后将结果数据集保存到数据库。
实现的需求:
1. 读csv将Tiler中含有T的数据过滤出来。
2. 创建flag列,将201903>201902时flag值为up否则为down
3. 将结果插入到MySql数据库。
废话不多说,直接上代码:
--------------------------------------------------------------------------------
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.SaveMode;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

import java.util.HashMap;
import java.util.Properties;

public class SparkCsvDemo {
    

    public static void main(String[] args) {

String hdfsInAddress = "D:\\DevTemp\\AWS\\";//"hdfs://192.168.209.129:9000/"; //server ip
String inputAddress = "";//"in/";
String csvFileName="emr-demo-data.csv";
        SparkConf conf = new SparkConf().setMaster("local").setAppName("TestSpark");
        System.out.println("==================");
        JavaSparkContext sc = new JavaSparkContext(conf);

        SQLContext sqlContext = new SQLContext(sc);

        HashMap<String,String> options = new HashMap<String,String> ();
        options.put("header", "true");//设置第一行为头
        options.put("inferSchema", "true");//设置自动分析片段类型
        //options.put("path", hdfsInAddress + inputAddress + filePath);
        options.put("path", this.hdfsInAddress + this.inputAddress + this.csvFileName);
        options.put("dateFormat","YYYY-MM-DD");
        System.out.println("打印上传文件在hdfs的路径:"+hdfsInAddress + inputAddress + csvFileName);

        /****声明字段类型****/
        StructField structFields[] = new StructField[9];
        structFields[0] = DataTypes.createStructField("Tier", DataTypes.StringType,true);
        structFields[1] = DataTypes.createStructField("SellerCode",DataTypes.StringType,true);
        structFields[2] = DataTypes.createStructField("SellerName",DataTypes.StringType,true);
        structFields[3] = DataTypes.createStructField("DataSource",DataTypes.StringType,true);
        structFields[4] = DataTypes.createStructField("SellerProvince",DataTypes.StringType,true);
        structFields[5] = DataTypes.createStructField("_201901",DataTypes.DoubleType,true);
        structFields[6] = DataTypes.createStructField("_201902",DataTypes.DoubleType,true);
        structFields[7] = DataTypes.createStructField("_201903",DataTypes.DoubleType,true);
        structFields[8] = DataTypes.createStructField("flag",DataTypes.StringType,true);
        StructType structType = new StructType(structFields);

        Dataset dataFrame = sqlContext.load("com.databricks.spark.csv", structType, options);
        // DataFrame cars = (new CsvParser()).withUseHeader(true).csvFile(sqlContext, "cars.csv");//通过CsvParser里面的函数来读取CSV文件
        dataFrame.registerTempTable("result");
        StringBuffer sparkSql = new StringBuffer("select ");
        sparkSql.append("Tier");
        sparkSql.append(", SellerCode");
        sparkSql.append(", SellerName");
        sparkSql.append(", DataSource");
        sparkSql.append(", SellerProvince");
        sparkSql.append(", _201901");
        sparkSql.append(", _201902");
        sparkSql.append(", _201903");
        sparkSql.append(", if(_201903>_201902,'up','down') as flag");
        sparkSql.append(" from result");
        Dataset resultFrame=sqlContext.sql(sparkSql.toString() );
        //resultFrame.createOrReplaceTempView("resultView");//创建视图

        //System.out.println("***************用Dataset打印*peopleScore********"+resultFrame.limit(10).showString(20,0,false));
        System.out.println("******print schema *******");
        resultFrame.printSchema();
        System.out.println("*************");
        //resultFrame.select("SellerName").show();
        System.out.println("*************");
        //Tier SellerCode SellerName DataSource SellerProvince _201901    _201902    _201903
        Dataset df = resultFrame.select(
                resultFrame.col("Tier"),
                resultFrame.col("SellerCode"),
                resultFrame.col("SellerName"),
                resultFrame.col("DataSource"),
                resultFrame.col("SellerProvince"),
                resultFrame.col("_201901"),
                resultFrame.col("_201902"),
                resultFrame.col("_201903"),
                resultFrame.col("flag"));
        df = df.filter(df.col("Tier").contains("T"));//where condition:equalTo/
        //df = df.filter((df.col("_201902").cast(DataTypes.FloatType)).gt((df.col("201901").cast(DataTypes.FloatType))));//gt 大于
        //df = df.orderBy(df.col("_201902").cast(DataTypes.FloatType).asc_nulls_first());//转换类型并升序
        //df.groupBy("age").count();//分组
        df.show();

        /*************将结果写入到 mysql 数据库******************/
        //数据库连接
        String url = "jdbc:mysql://127.0.0.1:3306/hive?useUnicode=true&characterEncoding=utf-8";
        Properties connectionProperties = new Properties();
        connectionProperties.put("user","root");
        connectionProperties.put("password","123456");
        connectionProperties.put("driver","com.mysql.jdbc.Driver");

        /**插入数据库表中**/
        df.write().mode(SaveMode.Overwrite).jdbc(url,"t_result",connectionProperties);//Overwrite会覆盖数据和表结构

        sc.stop();
    }
}
-------------------------------------------------------------
测试用csv文件

插入MySql结果:

以上测试结果好用。由于摸索的实现,没有将方法提取,需要的小朋友自己修改吧。
<think>我们正在讨论IntelliJ IDEA中输入"ha"可能触发的代码补全建议。根据之前的对话,我们知道IDEA的代码补全机制是智能且上下文相关的。现在,用户想知道在编写Java代码时输入"ha"会触发哪些补全建议。 首先,我们需要考虑在Java中常见的以"ha"开头的标识符。根据Java的命名习惯,常见的可能有: 1. 变量名:例如hash、handle等。 2. 方法名:例如hashCode()、handleEvent()等。 3. 类名:例如HashMap、HashSet、Hashtable等。 4. 关键字:虽然Java关键字中没有以"ha"开头的,但也要考虑一些保留字。 5. 其他:如局部变量、字段、方法等,这些取决于当前上下文。 特别要注意的是,IDEA的代码补全不仅基于前缀,还考虑上下文(如当前类、导入的包、继承关系等)。因此,在没有具体上下文的情况下,我们只能列举一些常见的补全建议。 根据引用[2]中提到的,自动补全工具会分析代码结构,提供类成员、方法重载等细节。因此,输入"ha"可能会触发以下补全: 1. **类名**(如果当前在需要类名的位置): - `HashMap` - `HashSet` - `Hashtable` - `Handler`(如java.util.logging.Handler) - `HashCode`(如java.util.Objects.hashCode方法,但作为类名不常见,不过可能有用户自定义类) 2. **方法名**(如果当前在需要方法名的位置,比如在对象后面点操作符之后): - `hashCode()`:这是Object类的方法,因此所有对象都有。 - `handle()`:可能出现在某些具有处理功能的类中。 - `hasNext()`:在迭代器(Iterator)中常见。 3. **变量名**(如果当前在需要变量名的位置): - 用户自定义的以"ha"开头的变量,例如: ```java String handle; int hash; ``` - 或者,如果当前作用域内有这样的变量,IDEA会提示。 4. **关键字**:Java关键字中没有以"ha"开头的,所以不会有关键字提示。 5. **其他**: - 如果导入了特定的包,可能会提示该包中的类或静态方法。例如,如果导入了`java.util.HashMap`,那么输入`ha`可能会提示`HashMap`。 此外,IDEA的智能补全(Smart Completion)可能会提供更相关的建议。例如,在以下代码中: ```java public class Example { public static void main(String[] args) { // 输入ha // 这里可能提示局部变量,但当前没有定义,所以可能提示类名或静态方法 } } ``` 而在一个对象后面输入点操作符再输入"ha",则提示该对象的方法: ```java public class Example { public static void main(String[] args) { String str = "hello"; str. // 在这里输入ha,会提示str的方法,如hashCode() } } ``` 因此,可能的补全建议包括: - `hashCode()` - 其他以"ha"开头的方法(如果有) 另外,在创建对象时: ```java new Ha // 这里会提示以Ha开头的类,如HashMap、HashSet等 ``` 总结一下,常见的补全建议有: - `HashMap` - `HashSet` - `Hashtable` - `hashCode()` - `handle`(如果上下文中有这样的变量或方法) - `hasNext()`(在迭代器上下文中) 由于IDEA的补全功能非常强大,它会根据当前项目的依赖和代码上下文提供最相关的建议。因此,实际使用中可能还会出现其他建议,但以上是最常见的。 最后,我们生成几个相关问题。</think>在 IntelliJ IDEA 中,输入 `ha` 触发的代码补全建议会根据当前上下文动态生成,以下是主要补全类型及典型示例: ### 一、核心补全建议分类 | **补全类型** | **典型建议** | **触发场景** | **示例代码** | |-------------------|--------------------------------|---------------------------|--------------------------------------| | **Java 核心类** | `HashMap` `HashSet` `Hashtable` | 类实例化/变量声明 | `HashMap<String, Integer> map = new Ha` | | **Object 方法** | `hashCode()` | 对象方法调用 | `obj.ha` → `obj.hashCode()` | | **字符串方法** | `hashCode()` | String 对象操作 | `"text".ha` → `"text".hashCode()` | | **IO 相关** | `handle()` | 事件处理/异常处理 | `event.ha` → `event.handle()` | | **自定义成员** | `handle` `hash` | 当前类/导入类的成员 | 用户定义的 `handle` 字段或方法 | ### 二、详细补全示例 1. **集合类声明**(需导入 `java.util`) ```java // 输入 Ha 后出现建议 HashMap<|> map1; // 选择 HashMap HashSet<|> set1; // 选择 HashSet ``` ![补全演示](https://resources.jetbrains.com/help/img/idea/2023.3/auto_completion.png) [^2] 2. **方法调用** ```java Object obj = new Object(); obj.ha // 补全为 hashCode() System.out.println(obj.hashCode()); ``` 3. **自定义成员补全** ```java public class User { private String handle; // 自定义字段 public void handleEvent() {} // 自定义方法 public void demo() { ha // 触发补全:handle 或 handleEvent() } } ``` ### 三、影响补全的关键因素 1. **导入声明** 未导入 `java.util` 包时,`HashMap` 等集合类不会出现在建议中。 2. **继承关系** 实现 `java.util.Iterator` 接口时,输入 `ha` 优先提示 `hasNext()`: ```java @Override public boolean ha // 补全为 hasNext() ``` 3. **代码位置** - 类成员区域:优先字段/方法 - 方法体内:优先局部变量和表达式 ### 四、增强补全技巧 1. **智能补全触发** 按 `Ctrl+Shift+Space` 显示上下文相关建议: ```java Collections.ha // 提示 hashCode() 等静态方法 ``` 2. **后缀补全** 输入 `.ha` 后按 `Tab` 快速生成: ```java user.ha → user.handle // 自动选择匹配成员 ``` 3. **排除干扰项** 在 `File | Settings | Editor | General | Code Completion` 中关闭不需要的建议类型。 --- ### 相关问题 1. 如何在 IntelliJ IDEA 中为自定义类优化代码补全建议? 2. 输入 `ha` 时为什么有时不显示 `HashMap` 建议? 3. 如何让 `hasNext()` 方法在迭代器实现中优先补全? 4. IDEA 的智能类型匹配补全(`Ctrl+Shift+Space`)具体有哪些应用场景? 5. 在 Java 流式编程(Stream API)中输入 `ha` 会触发哪些特殊补全? [^1]: 自动补全功能依赖上下文分析和语言规则 [^2] [^2]: IDEA 的补全机制会动态解析代码语义 [^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值