• 工作中遇到的--使用azure虚拟机的influxdb+chronograf+vscode/java POI转换数据格式


    1、首先建Azure虚拟机,几个关键点

    • public ip是外面访问用到的,所有都是他,或者找对应域名也ok
    • 我这里选的是用ssh登录,建立过程中有私钥,记得保存好
    • 用putty来连虚拟机的时候,要用puttygen来把私钥转换要,在连接的地方输好ip以后,在下面载入私钥(截图待补充)
    • azure自带防火墙,在networking里面白名单ip或者端口,这里面influxdb要白名单8086端口

    2、安装influxdb

    • 我建的ubuntu虚拟机,命令行直接安装就行
    • 安装好以后使用influx即可进入对应终端
    • influxdb有表和数据库两个概念,不同数据库可以有相同名字的表

    3、一些influxdb基本操作

    • create database name就是新建以name为名的数据库
    • 每次新打开要选好使用哪个database,比如use name,这个是使用名叫name的表
    • show databases 显示目前的各种database
    • drop database name 删除名叫name的数据库
    • precision rfc3339可以将时间戳转化成正常的年月日 时分秒显示,但是只是显示变了,本身数据没变,在其他里面调用数据还是原始格式
    • 如果使用查询语句,查的判断条件是tag,那么 select * from infra where "type"='mysql',如果查值就是 select * from infra where value=80 等号写一个。
    • insert数据的时候要首先选择数据库名,这里面以数据库名是test,表名infra为例
    • 注意influxdb的表不是显示独立建立的,要靠在插入的时候提到了,如果没有就独立建立
    • 如果插入的两条数据,他的表名,tag,时间戳完全相同,那么新的field值会修改原有的(注意时间戳叫time,如果有timestamp那是你自己命名的,和时间戳无关)
    • 人为规定时间戳,只可以使用时间戳方式,不能用年月日的! 参考链接:https://help.aliyun.com/knowledge_detail/114739.html

    3、chronograf

    • chronograf代替的是传统的influxdb自带的web管理界面
    • 要看chronograf是在开启chronograf.exe以后,访问http://localhost:8888
    • 注意,chronograf不是要求在虚拟机打开的哦,你在任何一台机器上都能打开,访问的是本地的8888
    • 在开启以后,需要输入你要链接的url,这时候是azure虚拟机对应ip的8086端口
    • 在chronograf中插入一条数据: infra,type=mysql,otherstring=aaa value=100 1599384988000000000
    • 插入的时候对应的值不带引号的!包括tag的也不带!和查询分开!注意!另外时间戳要19位的,自动转化工具需要补0
    • 上面那条,第一个是表明,后面逗号隔开的都是tag value,也就是值,是field(当然不一定叫value) 最后是时间戳
    • 官网下载地址:https://portal.influxdata.com/downloads/

    4、其他操作

    • 给的数据是excel格式的,显然不可能手动用于insert,那么就有两种选择
      • 使用vscode调整格式
      • 使用java POI相关的包来完成
    • 如果选择vscode,那么直接把excel表复制过来,然后进入vscode列编辑模式,快捷键应该是shift+alt+鼠标左键,把整行都选上,然后整行改,最后一个时间戳不是对齐的,使用替换功能把tab换成空格之类的,完成转化
    • 或者使用java poi对应的包 
      • 这个cell类型在高版本的包中发生了变化,代码是修改过的,网上原始的代码新版本jar包不能用
      • 如果数字位数很多,尽管在excel中设置了文本类型,但是出来的还是科学技术法,不能单纯用string.valueOf,要用DecimalFormat,具体见代码
      • 要下载导入对应jar包
      • 参考链接如下
        • 如何避免数字变成科学计数法:https://blog.csdn.net/xingxiupaioxue/article/details/54411824
        • 关于高版本中jar包变动:https://www.cnblogs.com/sengzhao666/p/11144902.html
        • 原始转换参考代码 :https://blog.csdn.net/usuallyuser/article/details/81217122
    import java.io.BufferedWriter;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStreamWriter;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DateUtil;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    
    @SuppressWarnings("resource")
    public class ExcelToTxt {
    
        public static void main(String[] args) throws IOException {
            Workbook wb = null;
            Sheet sheet = null;
            Row row = null;
            List<Map<String, String>> list = null;
            String cellData = null;
            String excelPath = "D:/data/sensors-ounce.xlsx";
            String textPath = "D:/data/sensors-ounce.txt";
            String columns[] = { "type", "timestamp", "value", "time"};
            wb = readExcel(excelPath);
            if (wb != null) {
                // 用来存放表中数据
                list = new ArrayList<Map<String, String>>();
                // 获取第一个sheet
                sheet = wb.getSheetAt(0);
                // 获取最大行数
                int rownum = sheet.getPhysicalNumberOfRows();
                // 获取第二行
                row = sheet.getRow(1);
                // 获取最大列数
                int colnum = row.getPhysicalNumberOfCells();
                for (int i = 0; i < rownum; i++) {
                    Map<String, String> map = new LinkedHashMap<String, String>();
                    row = sheet.getRow(i);
                    if (row != null) {
                        for (int j = 0; j < colnum; j++) {
                            cellData = (String) getCellFormatValue(row.getCell(j));
                            map.put(columns[j], cellData);
                        }
                    } else {
                        break;
                    }
                    list.add(map);
                }
            }
            // 遍历解析出来的list
            StringBuffer sb = new StringBuffer();
            for (int i = 1; i < list.size(); i++) {
                sb.append("infra,");
                int count=0;
                for (Entry<String, String> entry : list.get(i).entrySet()) {
                    String value = entry.getValue();
                    //System.out.println(i);
                    if(count==0)
                        sb.append("type=" + value + ",");
                    else if(count==1)
                        sb.append("timestamp="+value+" ");
                    else if(count==2)
                        sb.append("value="+value+" ");
                    else
                        sb.append(value);
                    count++;
                    //sb.append(value + ",");
                }
                sb.append("
    ");
            }
            WriteToFile(sb.toString(), textPath);
    
            System.out.println("*************EXCEL转成TXT格式成功*************");
    
        }
    
        // 读取excel
        public static Workbook readExcel(String filePath) {
            Workbook wb = null;
            if (filePath == null) {
                return null;
            }
            String extString = filePath.substring(filePath.lastIndexOf("."));
            InputStream is = null;
            try {
                is = new FileInputStream(filePath);
                if (".xls".equals(extString)) {
                    return wb = new HSSFWorkbook(is);
                } else if (".xlsx".equals(extString)) {
                    return wb = new XSSFWorkbook(is);
                } else {
                    return wb = null;
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return wb;
        }
    
        public static Object getCellFormatValue(Cell cell) {
            Object cellValue = null;
            if (cell != null) {
                // 判断cell类型
                switch (cell.getCellType()) {
                    case NUMERIC: {
                        //cellValue = String.valueOf(cell.getNumericCellValue());
                        DecimalFormat df = new DecimalFormat("0");
                        cellValue = df.format(cell.getNumericCellValue());
                        break;
                    }
                    case FORMULA: {
                        // 判断cell是否为日期格式
                        if (DateUtil.isCellDateFormatted(cell)) {
                            // 转换为日期格式YYYY-mm-dd
                            cellValue = cell.getDateCellValue();
                        } else {
                            // 数字
                            cellValue = String.valueOf(cell.getNumericCellValue());
                        }
                        break;
                    }
                    case STRING: {
                        cellValue = cell.getRichStringCellValue().getString();
                        break;
                    }
                    default:
                        cellValue = "";
                }
            } else {
                cellValue = "";
            }
            return cellValue;
        }
    
        /**
         * 生成文件
         * @param str
         * @param filePath
         * @throws IOException
         */
    
        public static void WriteToFile(String str, String filePath) throws IOException {
            BufferedWriter bw = null;
            try {
                FileOutputStream out = new FileOutputStream(filePath, true);// true,表示:文件追加内容,不重新生成,默认为false
                bw = new BufferedWriter(new OutputStreamWriter(out, "GBK"));
                bw.write(str += "
    ");// 换行
                bw.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                bw.close();
            }
        }
    View Code
    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    请用正则实现String.trim()
    事件委托的原理是什么?有什么作用?
    请简述get请求和post请求的区别
    用原生js实现,点击一个列表时,输出对应的索引
    请用js写一个函数,实现获取浏览器url中查询字符串中的参数并返回一个数组
    请描述一下cookies、sessionStorage、localStorage、session四者的区别?
    清除浮动的几种方式,各自的优缺点?
    如何使用离线存储(localStorage)?
    使用css怎么让谷歌支持小于12px的文字比如10px
    ajax有哪些方法可以实现跨域?他们都有哪些局限性?
  • 原文地址:https://www.cnblogs.com/tingxilin/p/13622496.html
Copyright © 2020-2023  润新知