json数据源文件解析

文章: http://blog.csdn.net/lili72

背景: 分布式文件通过rsync同步到生产机。 文件数 1440=24*60  也就是一分钟生成一个文件 文件命名 0000 0001 0002 ... 2358 2359 。由于文件传过来是JSON格式,需要对文件进行解析,导入HDFS中。

过程

1  rsync同步文件到当天的日期目录,每天实时把文件同步到生产机制定目录,每天生成新文件夹,由于是每分钟生成文件,每个文件夹都有1440个文件。

1.1  修改配置文件,增加一个目录的同步权限。

Vi  /etc/rsyncd.conf

[orders]

  path = /etldata/order

  list=yes

  ignore errors

  auth users = hadoop

  secrets file = /etc/rsyncd.secrets

  comment = This is test  data

  

1.2  一条命令即可同步。

rsync -az --port=8730 /data1/queue/ex_user_lastlogin/20141210/  [email protected]::userOrder/

2  对当天日期文件进行解析成以|分隔,检查文件数量是否达到1440个,对当天的日期文件夹中的文件进行解析转换。文件命名用一定的规则。 处理好该天的数据生成日期.ok文件

3  导入HDFS(hive)中,每天定时检查日期.ok文件是否生成,生成则load 前一天日期的数据。

2.1  Json解析工具选择,Jackson效率比较高

Json数据样例:{"data":{"serverid":"1001","appid":1005,"client_ip":"118.180.156.249","time":"2014-12-11 23:59:59","userid":361443577},"ordertype":1}

新建java model

public class UserLog {
private String   serverid="";
private String  servertime="";
private  String  userid="";
private  String  appid="";
private  String  client_ip="";
    //空的构造函数一定要
public UserLog(){
}
public UserLog(String serverid, String servertime, String userid, String appid,
String client_ip) {
this.serverid = serverid;
this.servertime = servertime;
this.userid = userid;
this.appid = appid;
this.client_ip = client_ip;
}

public String getServerid() {
return serverid;
}

public void setServerid(String serverid) {
this.serverid = serverid;
}

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getAppid() {
return appid;
}

public void setAppid(String appid) {
this.appid = appid;
}

public String getClient_ip() {
return client_ip;
}

public void setClient_ip(String client_ip) {
this.client_ip = client_ip;
}

public String getServertime() {
return servertime;
}

public void setServertime(String servertime) {
this.servertime = servertime;
}

@Override
public String toString() {
return  serverid+"|" + userid+"|" +appid+"|"+servertime+"|"+client_ip;
}
 

另外一个model

public class UserModel {
private  UserLog  data;
private String  type="" ;
public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public  UserModel(){
}

public UserLog getData() {
return data;
}

public void setData(UserLog data) {
this.data = data;
}
@Override
public String toString() {
return data.toString()+"|"+type;
}

}
 

解析程序:

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.codehaus.jackson.map.ObjectMapper;

public class UserLoginLog {
 private static final ObjectMapper mapper = new ObjectMapper();

 public  static  final  String   descPath="/etldata/usertest/data";

 public static  long  total_count=0;

public static  void JsonToBean(String  strline) throws Exception {
UserLog bean = mapper.readValue(strline, UserLog.class);
        System.out.println(bean.toString());
    }
public static void main(String[] args) throws Exception {
if(args.length<1){
System.err.println("Usage Main : [java   -jar  sourcePathFileName  [descPath]  ");
System.exit(0);
}
 // 传入基础路径参数
//  /etldata/userlogin/85
String  basePath =args[0];
String  desFileName =null ;
String  sourcFileName="F:/0000.log";
//获取  24 * 60 分钟的文件名称
List<String>  paths=getFileName();
//记录开始时间
long   start_time= System.currentTimeMillis();
SimpleDateFormat  sf = new SimpleDateFormat("yyyyMMdd");
String currentDate= sf.format(new Date());
//输出路径    默认是   /etldata/userlogin/data/yyyymmdd/0000.txt
desFileName =descPath+"/"+currentDate ;
//如果传入的目标参数 不为空   则生成文件到指定的目录
if(args.length==2){
desFileName=args[1];
}
//循环读取源文件夹下的文件   循环解析到目标目录
for(String fileNum: paths){
sourcFileName =basePath+"/"+fileNum+".log";
System.out.println("sourcFileName-----" +sourcFileName);
System.out.println("desFileName------" + desFileName);
readFile(sourcFileName,desFileName+"/" +fileNum+".txt");
}
long  end_time =System.currentTimeMillis();
System.out.println("do  finsh -----!  花费时间    " +(end_time-start_time)  +"  处理 "+ total_count +"  行数据");
}
/**
 * @return
 * 构造 24 * 60  每分钟生成一个文件的  文件名称  0000  0001  0002 .... 2358  2359
 */
public static List<String> getFileName() {
String hour = "";
String minu = "";
List<String> fileNameList = new ArrayList<String>(1441);
for (int i = 0; i < 24; i++) {
hour = i + "";
if (hour.length() == 1) {
hour = "0" + hour;
}
for (int j = 0; j < 60; j++) {
minu = j + "";
if (minu.length() == 1) {
minu = "0" + minu;
}
fileNameList.add(hour + minu);
}
}
return fileNameList;
}
 /**
 * @param sourcFileName
 * @param desFileName
 * @throws Exception
 *  读取数据出来 然后解析    同时记录条数
 *  {"data":{"serverid":"1001","appid":1001,"client_ip":"120.217.97.205","time":"2014-12-11 23:59:59","userid":19617632},"ordertype":1}
 */
public  static  void   readFile(String  sourcFileName,String desFileName) throws Exception{

 FileReader fr=new FileReader(sourcFileName);
         LineNumberReader lr=new LineNumberReader(fr,512);
         while(lr.readLine()!=null){
             String str=lr.readLine();
             UserModel bean =null;
             if(str!=null){
             bean = mapper.readValue(str, UserModel.class);
             writeFile(bean.toString()+"\n",desFileName);
             total_count = total_count +1 ;
             }
         }
         lr.close();
 }
 /**
 * @param content
 * @param pathName
 * @return
 * @throws IOException
 * 解析之后的文件   写到另外一个目录
 */
public static String writeFile(String content,String pathName) throws IOException {
File file = new File(pathName);
if(!file.exists()){
file.getParentFile().mkdirs();
file.createNewFile();
}
appendFileStr(pathName, content );
return  pathName ;
}
/**
 * @param fileName
 * @param content
 * 追加文件内容
 */
public static void appendFileStr(String fileName, String content){
try {
FileWriter writer = new FileWriter(fileName, true);
writer.write(content);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}  

}

依赖的jar    下载地址:http://download.csdn.net/detail/lili72/8279053

3  用脚本定时起调。

#!/usr/bin/env bash
# ************************************************************************
# yyyymmdd       version      author               modified
# --------       ---------    -------------      ----------------------
# 20141208       V14.00.001   lisc
#
# ************************************************************************

if [ $# -gt 1 ];then # 参数个数,需视具体参数修改
   echo "Params error."
   echo "Useage: load_user_login_log.sh [data_date]"
   exit 1
fi

logfile=$BIPROG_ROOT/logs/`basename $0`.log #定义写日志文件名

###############################引入公共函数库#########################

vDay=${1:-"`lastday YYYY-MM-DD`"} #如果没有传日期的参数,默认取昨天
vDay2=${1:-"`lastday YYYYMMDD`"} #如果没有传日期的参数,默认取昨天
dtstr=`date -d "0 day ago " +%Y-%m-%d" "%H:%M:%S`

echo $vDay2
############################ 功能执行部分 ############################
writelog "Program($VERSION) start..."

# 先解析文件
java -jar   /etldata/userorder/pare_json.jar   /etldata/userorder/85  /etldata/userorder/data/${vDay2}
touch   /etldata/userorder/data/${vDay2}/${vDay2}.ok

# load  到hive
SQL="
  load    data   local  inpath '/etldata/userorder/data/${vDay2}/*.txt' overwrite into table userorder.st_userorder_log partition(dt='${vDay}');"

echo $SQL | $HIVE_HOME/bin/hive
时间: 2024-10-14 06:07:48

json数据源文件解析的相关文章

android通过httpClient请求获取JSON数据并且解析

android通过httpClient请求获取JSON数据并且解析:http://www.cnblogs.com/gzggyy/archive/2013/05/08/3066288.html Android--使用Http向服务器发送请求并取得返回结果,下载图片:http://www.2cto.com/kf/201307/229489.html Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据):http://blog.csdn.net/he

swift http请求返回json数据并解析

1 AppDelegate.swift // // AppDelegate.swift // QQDemo // // Created by 赵超 on 14-6-21. // Copyright (c) 2014年 赵超. All rights reserved. // import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? fun

iOS开发网络篇—JSON数据的解析

iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim

android中对json数据的解析,并在listview中实际运用

android中对json数据的解析,并在listview中现实,下面是数据{"ziparea": "410100.0", "enddate": "2015-04-03 00:00:00", "ecertarea": "\u9053\u8def\u8d27\u7269\u8fd0\u8f93\u9a7e\u9a76\u5458", "ecertstate": &quo

Android 之 json数据的解析(jsonReader)

json数据的解析相对而言,还是比较容易的,实现的代码也十分简单.这里用的是jsonReade方法来进行json数据解析. 1.在解析之前,大家需要知道什么是json数据. json数据存储的对象是无序的“名称/值”对的集合.和其他的数据存储方式相比,json数据的可读性,可扩展性,编码难度,解码难度都有一定的优势.在json数据中, 对于一个对象: (1)一个对象以“{”(左括号)开始,“}”(右括号)结束. (2)每个“名称”后跟一个“:”(冒号): (3)“‘名称/值’ 对”之间使用“,”

Android 网络请求json数据,解析json数据,生成对应的java bean类一步到位,快速开发

Android 网络请求一般都涉及到图片和JSON数据,怎样快速的请求网络JSON数据,解析JSON数据,并且一步生成自己想要的Java bean实体类?这个涉及到Android 开发效率的问题.由于接触Android 网络这方面比较多,自然就找到一些好的方法来快速开发Android 网络模块的相关内容,接下来就为大家揭晓 一步快速请求,解析JSON 数据生成对应的Java bean实体类的方法. 注:我们先把思路讲解下吧: 1.网络请求JSON数据代码可以自己写,当然我还是推荐使用网络上开源的

Android Json数据的解析+ListView图文混排+缓存算法Lrucache 仿知乎

前几天心血来潮,打算根据看知乎的API自己做一个小知乎,定制的过程遇到ListView的优化问题及图片未缓存重加载等等许多问题,解决了以后打算和博友分享一下. 接口数据:http://api.kanzhihu.com/getpostanswers/20150925/archive 首先,Json数据太常用,相信每一位开发者Json的解析都是必备的.我们要准备以下知识: JavaBean,枚举你需要的元素,用来存储数据. 异步加载网络内容的必备途径,多线程加载+AsyncTask两种方式. Jso

IOS中JSON数据的解析

IOS中JSON数据解析 官方为我们提供的解析JSON数据的类是NSJSONSerialization,首先我们先来看下这个类的几个方法: + (BOOL)isValidJSONObject:(id)obj; 判断一个数据对象是否可以转化为JSON数据 + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error; 将JSON数据写为NSData数据,其中opt参数

android 客户端访问自己建立的服务器并返回JSON数据进行解析学习

最近在找关于客户端访问服务器开发的用例 总是去访问别人的网站也不能对里面的数据进行修改也不知道是怎么实现的,自己在网上申请了一个免费的服务器网站上传了一个php文件,现在就可以通过urlStr===http://1.hellowes.sinaapp.com/访问服务器上的信息了,并且服务器会返回一个数据,由于对php一点不懂所以服务器上返回的并不是真正的JSON数据,所以只好通过客户端字符串组合成一个JSON语句通过JSONObject进行解析出来, 下面贴出实现代码,总算是可以从服务器上获取信