scala時間處理及其他代碼塊


1.時間戳(毫秒)轉時間

    var time2 = 1541827261631d;
    var result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2)
    println(result2)

普通顯示的

//long timeStamp = 1495777335060;//直接是時間戳
long timeStamp = System.currentTimeMillis();  //獲取當前時間戳,也可以是你自已給的一個隨機的或是別人給你的時間戳(一定是long型的數據)
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//這個是你要轉成后的時間的格式
String sd = sdf.format(new Date(timeStamp));   // 時間戳轉換成時間
        System.out.println(sd);//打印出你要的時間

2.保留小數點后12位數字

 // 數據格式 經緯度小數度只保存12個。如果后面有0舍棄
    def dataformat(nn: Int) : String ={
      var df2 = new DecimalFormat("###.000000000000");//定義格式
      return df2.format((nn.toDouble/60000).toFloat) //將值再轉位float這個的好處是,例如:原來的:3.4567000000,轉為3.4567
    }

3.2進制轉10進制

    //2進制轉10進制
    @Test
    public void tt(){
        int m=Integer.parseInt("1001",2);
     System.out.println(m);
    }

4.16進制轉2進制

    // 16進制轉2進制
    @Test
    public void function1( ) {
        int n = Integer.parseInt("3", 16);
        String result = Integer.toBinaryString(n);
        //預先定義一個8位0
        StringBuilder zero =new StringBuilder("00000000");
        String result3 = zero.substring(0, zero.length() - result.length()) + result;
        // int r = Integer.parseInt(result);
        // System.out.println(r);
        System.out.println(result3);
    }

5.進制轉換

@Test
    public void test07() {
        int i = Integer.parseInt("3", 16); // 16代表前的的是十六進制數值 7-8位
        String s = Integer.toHexString(i); // 需要時再轉回字符串形式
        String s3 = Integer.toHexString(100000); // 需要時再轉回字符串形式
        System.out.println(i + "--i");// true
        System.out.println(s3 + ":s3---");// true 3e7--->999 64---100
        System.out.println(s + "+++s");// trues

    }

6.正則匹配

// 正則表達式匹配
    // 參考 :https://zhidao.baidu.com/question/552412036.html
    // 參考 :https://www.cnblogs.com/sparkbj/articles/6207103.html
    @Test
    public void test06() { // [0-9]{1,3} 以數字長度為1到3位 。以a字符開頭以b字符結尾
        Pattern p = Pattern.compile("a[0-9]{1,3}b");
        Matcher m = p.matcher("a724b");
        boolean b = m.matches();
        System.out.println(b);// true
    }

 7.截取特殊符號前后字符串

//java版:獲取特殊符號后面的字符串
String  str ="abc.rar";
String [] strs = str.split("[.]");
System.out.println("符號前面的字符串="+strs[0]);
System.out.println("符號后面的字符串="+strs[1]);

//scala版
    var  str ="abc.rar";
    var strs = str.split("[.]");
    println("符號前面的字符串="+strs.apply(0))
    println("符號后面的字符串="+strs.apply(1))

//scala版推薦使用
    val a = "aa-bc-xx"
    val i = a.indexOf("-")
    val x = a.indexOf("-", i)
    val one = a.substring(0, i)
    print(one) //aa
    val two = a.substring(i + 1, x)
    print(two) //bc
    val three = a.substring(x + 1)
    print(three)//xx

 8.時間格式化

//scala版    
    var time2 = "2018-11-13 15:49:4"
    var date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time2);
    println(date)
    var now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
    println(now)

//java版 先用parse將字符串解析成date型,再用format格式化成string。
  Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2005-06-09");
  String now = new SimpleDateFormat("yyyy年MM月dd日").format(date);

 綜合,下面有可能會重復,但實現方式是不一樣的

 //16 轉 10
  def SixteenTurnTen (SixteenString:String): String ={
    var str = new BigInteger(SixteenString,16).toString(10)
    str
  }
//16 轉 2 單參數
def SixteenTurnTwo (SixteenString:String): String ={
var str = new BigInteger(SixteenString,16).toString(2)
var a = str.length;
while (a < 8){
str = "0"+str
a += 1
}
str
}
//16 轉 2
  def SixteenTurnTwo (SixteenString:String,lengthStr:Int): String ={
    var str = new BigInteger(SixteenString,16).toString(2)
    var a = str.length;
    while (a < lengthStr){
      str = "0"+str
      a += 1
    }
    str
  }
  //2 轉 10
  def TwoTurnTen (SixteenString:String): String ={
    var str = new BigInteger(SixteenString,2).toString(10)
    str
  }
  //經緯度計算並且四舍五入
  def Rounding(SixteenDouble:Double):String = {
    var formatDouble = NumberFormat.getNumberInstance()
    formatDouble.setMaximumFractionDigits(12)
    formatDouble.setRoundingMode(RoundingMode.UP)
    formatDouble.format(SixteenDouble/60000)
  }
  //時間戳轉化為時間
  def tranTimeToString(tm:String) :String={
    val fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    val tim = fm.format(new Date(tm.toLong))
    tim
  }

  //補齊0
  def Complement(str:String,length:Int): String = {
    var stringValue = str
    var value = str.length
    if (value < length){
      while (value < length){
        stringValue = "0" + str
        value = length
      }
    }
    stringValue
  }

 9.一個程序同時消費多個kafkak里的數據

import org.apache.spark.streaming.kafka010.ConsumerStrategies
//下面是spark streaming消費多個主題
  val topic = Array("k1", "k2","k3")
 //接收數據
    var stream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream[String, String](
      ssc,
      PreferConsistent,
      ConsumerStrategies.Subscribe[String, String](topic, kafkaParams)  // ---
    )
    var events: DStream[String] = stream.map(r => r.value()+"_"+r.topic())

//下面是spark structed streaming消費多個主題
val kafkaKvPair = spark
  .read
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "topic1")
  .load()
  .selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)] 

多個topic就逗號分割一下即可,比如
.option("subscribe", "topic1,topic2,topic3"

 10.兩個map合並為一個map且根據主鍵合並

def main(args: Array[String]): Unit = {
    var A:Map[String,String] = Map()
    A+=("101"->"a1")
    A+=("102"->"a2")
    A+=("103"->"a3")
    A+=("104"->"a4")
    A+=("105"->"a5")
    A+=("106"->"a6")
    var B:Map[String,String] = Map()
    B+=("101"->"b1")
    B+=("102"->"b2")
    B+=("103"->"b3")
    B+=("104"->"b4")
    B+=("105"->"b5")

      A.foreach(a=>{
        var ak= a._1
        B.foreach(b=>{
          var bk=b._1
          if (ak==bk){
            var vaule=A.get(ak.toString()).getOrElse(Tuple1[String]("")).toString+","+B.get(bk.toString()).getOrElse(Tuple1[String]("a")).toString
            A+=(ak.toString()->vaule)
          }
        })
      })
    println(A)
  }
//Map(104 -> a4,b4, 103 -> a3,b3, 106 -> a6, 102 -> a2,b2, 101 -> a1,b1, 105 -> a5,b5)

11.兩個表廣播(只是借鑒)

 val sql = "SELECT * FROM " + FunctionEntity.getString("oracle.tableName")
    var mapValue: Map[String, String] = OracleConnect.getData(sql)
    var oracleValue: Broadcast[Map[String, String]] = ssc.sparkContext.broadcast(mapValue)
    
    val sqlTwo = "SELECT * FROM " + FunctionEntity.getString("oracle.tableNameTwo")
    var mapValueTwo: Map[String, String] = OracleConnect.getDataTwo(sqlTwo)
    var oracleValueTwo: Broadcast[Map[String, String]] = ssc.sparkContext.broadcast(mapValueTwo)

 var value: Map[String, String] = RepairEditionNine.analysisString(dataLineValue, 1)
              var fianlMap: Map[String, String] = OracleConnect.getRelationData(value, oracleValue.value)
              var fianlMapTwo: Map[String, String] = OracleConnect.getRelationDataTwo(fianlMap, oracleValueTwo.value)
              var put: Put = HbaseConnect.WriteHbase(fianlMapTwo)

12.這個是別人寫的時間處理。寫的比較多,可以使用:https://blog.csdn.net/springlustre/article/details/47273353

13.比較復雜的時間獲取,例如今天周6,周7等:https://blog.csdn.net/qq_16038125/article/details/72834270

 

import java.text.SimpleDateFormat
import java.util.{Calendar, Date}

object T03 {
  def main(args: Array[String]): Unit = {
    //2018/12/13 13:50:16
    println(dayOfWeek("2018-12-23"))
    println(getNowTime())
  }

  //獲取昨天日期
  def getNowTime():String={
    var  dateFormat:SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")
    var cal:Calendar=Calendar.getInstance()
    cal.add(Calendar.DATE,-1)
    var yesterday=dateFormat.format(cal.getTime())
    yesterday
  }

  //獲取本周一的日期
  def getNowWeekStart():String={
    var period:String=""
    var cal:Calendar =Calendar.getInstance();
    var df:SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
    //獲取本周一的日期
    period=df.format(cal.getTime())
    period
  }

  //星期天數
  def dayOfWeek(dateStr: String): Int = {
    val sdf = new SimpleDateFormat("yyyy-MM-dd")
    val date = sdf.parse(dateStr)
    val cal = Calendar.getInstance();
    cal.setTime(date);
    var w = cal.get(Calendar.DAY_OF_WEEK)-1 ;
    //星期天 默認為7
    if (w <= 0)
      w = 7
    w
  }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM