Apache Spark2 Dataframe Tarih Saat İşlemleri

Merhaba, bu yazımızda Spark Dataframe tarih-saat için kullandığım bazı işlemleri paylaşacağım. Tarih saat işlemlerinde format dilden dile, ülkeden ülkeye ve kültürden kültüre biraz farklı olduğu için sık sık düzeltme ve dönüştürme yapmak gerekir. Örneğin bizde gün/ay/yıl kullanımı yaygın iken bazı ülkelerde /ay/gün/yıl kullanımı yaygındır. 03/07/1999 tarihini örnek alalım: Bu 3 Temmuz mu, yoksa 7 Mart mı?

Bu yazıda kullanacağım araçlar şunlardır:

  • Spark Sürümü: Spark 2.1.1
  • Geliştirme Ortamı: Apache Zeppelin Notebook
  • Kaynak Yönetimi: Apache YARN (Yani Spark’ı YARN modunda çalıştırıyorum)
  • Veri Depolama: Hadoop HDFS
  • Programlama Dili: Scala

Zeppelin kullandığım için ayrıca SparkContext() yaratmayacağım, çünkü Zeppelin bu işi bizim için yapıyor. Ayrıca interpreter ayarlarımda Spark2 varsayılan interpereter olduğundan her paragrafta %Spark2 diye belirtmeyeceğim.

Güncel tarih ve saati görmek
spark.range(1).select(current_timestamp).show(1, false)
+-----------------------+
|current_timestamp()    |
+-----------------------+
|2017-10-29 13:31:22.285|
+-----------------------+

yukarıdaki ifadenin formatı: yyyy-MM-dd hh:ss:mm aa (yyyy: yıl, MM:ay, dd:gün hh:saat, ss:dakika, mm:saniye, aa:salise)

Güncel tarihi görmek
spark.range(1).select(current_date).show(1, false)
+--------------+
|current_date()|
+--------------+
|2017-10-29    |
+--------------+
Spark Dataframe Sütun Adını Değiştirmek (withColumnRenamed)

Yukarıdaki işlemi sütun adını değiştirerek yapalım. Çünkü sütun adı fonksiyon ismi olarak yakışıksız duruyor.  withColumnRenamed("eski_sütun_adı","yeni_sütun_adı")

val todayDF = spark.range(1).select(current_date).withColumnRenamed("current_date()","Today")
todayDF.show(1, false)
+----------+
|Today|
+----------+
|2017-10-29|
+----------+
Spark Dataframe Tarih Format Dönüşümü (date_format)

Yukarıda bugünün tarihini todayDF içinde Today isimli bir sütun olarak elde ettik. Şimdi bunu iki farklı formatta iki sütun daha ekleyerek değiştirelim. Formatın birisi Türk usulü, diğeri İngiliz usulü olsun. date_format("formatlanacak_sütun_ismi","format")

var TurkishFormat = "dd/MM/yyyy"
var EnglishFormat = "MM/dd/yyyy"
todayDF.withColumn("Today_Turkish",date_format($"Today", TurkishFormat)).withColumn("Today_English",date_format($"Today", EnglishFormat)).show(1, false)
TurkishFormat: String = dd/MM/yyyy
EnglishFormat: String = MM/dd/yyyy
+----------+-------------+-------------+
|Today     |Today_Turkish|Today_English|
+----------+-------------+-------------+
|2017-10-29|29/10/2017   |10/29/2017   |
+----------+-------------+-------------+
Spark Dataframe Tarih-Saat Format Dönüşümü (date to timestamp)

Benzer yaklaşımla tam tarih saat damgası elde edelim.

var TurkishTSFormat = "dd/MM/yyyy hh:ss:mm aa"
var EnglishTSFormat = "MM/dd/yyyy hh:ss:mm aa"
todayDF.withColumn("TurkishTS",date_format($"Today", TurkishTSFormat)).withColumn("EnglishTS",date_format($"Today", EnglishTSFormat)).show(1, false)
TurkishTSFormat: String = dd/MM/yyyy hh:ss:mm aa
EnglishTSFormat: String = MM/dd/yyyy hh:ss:mm aa
+----------+----------------------+----------------------+
|Today     |TurkishTS             |EnglishTS             |
+----------+----------------------+----------------------+
|2017-10-29|29/10/2017 12:00:00 AM|10/29/2017 12:00:00 AM|
+----------+----------------------+----------------------+
Spark Dataframe Tarih Sütununa Gün Ekleme (date_add)

Bir yıl sonrasının tarihini bir sütun yanda gösterelim

todayDF.withColumn("OneYearLater", date_add($"Today", 365)).show(1, false)
+----------+------------+
|Today     |OneYearLater|
+----------+------------+
|2017-10-29|2018-10-29  |
+----------+------------+
Spark Dataframe Tarih Sütununa Ay Ekleme (add_months)

Yukarıda 365 gün ile yaptığımızı 12 ay ile yapalım.

todayDF.withColumn("TwelveMonthsLater", add_months($"Today", 12)).show(1, false)
+----------+-----------------+
|Today     |TwelveMonthsLater|
+----------+-----------------+
|2017-10-29|2018-10-29       |
+----------+-----------------+
Spark Dataframe İki Tarih Arasındaki Farkı Gün Olarak Bulmak (datediff)

Bu fonsiyon iki tarih sütunu arasındaki farkı gün olarak geri döndürür. Şimdi gün ekleme işleminin tersini yapalım. Ancak yukarıda gün ekleme için kullandığımız todayDF’i başka bir DF’e atayalım. datediffDF diye adlandırdığımız bu yeni DF’in iki sütunu arasında fonksiyonu çalıştıralım. Fonksiyonun ikinci parametresi, ilk parametresinden çıkarılır.

val datediffDF = todayDF.withColumn("OneYearLater", date_add($"Today", 365))
datediffDF.withColumn("DiffBetweenTwoDate", datediff($"OneYearLater", $"Today")).show(1, false)
datediffDF: org.apache.spark.sql.DataFrame = [Today: date, OneYearLater: date]
+----------+------------+------------------+
|Today     |OneYearLater|DiffBetweenTwoDate|
+----------+------------+------------------+
|2017-10-29|2018-10-29  |365               |
+----------+------------+------------------+
Spark Dataframe İki Tarih Arasındaki Farkı Ay Olarak Bulmak (months_between)

Gün farkı yerine ay farkı bulalım.

val datediffDF = todayDF.withColumn("OneYearLater", date_add($"Today", 365))
datediffDF.withColumn("MonthsDiffBetweenTwoDate", months_between($"OneYearLater", $"Today")).show(1, false)
datediffDF: org.apache.spark.sql.DataFrame = [Today: date, OneYearLater: date]
+----------+------------+------------------------+
|Today     |OneYearLater|MonthsDiffBetweenTwoDate|
+----------+------------+------------------------+
|2017-10-29|2018-10-29  |12.0                    |
+----------+------------+------------------------+
Tarih Sütunundan Yılı Rakam Olarak Almak

Şimdide tarih sütunundan yılı rakam olarak alıp yeni yeni bir sütuna alalım.

datediffDF.withColumn("YearOfDate", year($"Today")).show(1, false)
+----------+------------+----------+
|Today     |OneYearLater|YearOfDate|
+----------+------------+----------+
|2017-10-29|2018-10-29  |2017      |
+----------+------------+----------+
Zaman damgasından Yılı Rakam Olarak Almak

Peki şimdi tarihten değil de zaman damgasında yılı rakam olarak alalım. Değişen hiç bir şey olmayacak yine year() fonksiyonunu kullanacağız.

val dfNowTimestampDF = spark.range(1).select(current_date).withColumnRenamed("current_date()","NowTimestamp")
dfNowTimestampDF.show(1, false)
dfNowTimestampDF.withColumn("YearOfTimestamp", year($"NowTimestamp")).show(1, false)
dfNowTimestampDF: org.apache.spark.sql.DataFrame = [NowTimestamp: date]
+------------+
|NowTimestamp|
+------------+
|2017-10-29  |
+------------+
+------------+---------------+
|NowTimestamp|YearOfTimestamp|
+------------+---------------+
|2017-10-29  |2017           |
+------------+---------------+
String Halindeki Tarih Bilgisini Timestamp Türüne Dönüştürmek

Zaman damgası bir şekilde elinizde string olabilir. Tarih ve saat ile ilgili fonksiyonları rahatlıkla kullanmak için string halindeki bu zaman bilgisinin türünü timestamp’e dönüştürmek gerekebilir. Öncelikle str_dates adında içinde iki tane zaman bilgisi bulunan bir liste oluşturalım. Listenin elemenlatının türü string olacaktır. Bu listeyi toDF ile dataframe yapıp adına dateDF diyelim. Daha sonra string içindeki zaman bilgisi formatı ne ise onu format adında bir değişkende saklayalım. dd.MM.yyyy gün ay yıl hh:mm:ss ise saat dakika ve saniyeyi temsil etmektedir.

import spark.implicits._
val str_dates = List("23.01.2013 08:50:21","06.04.2015 11:16:25")
val dateDF = str_dates.toDF
var format = "dd.MM.yyyy hh:mm:ss"
val dateDF2 = dateDF.withColumn("servicedate_new", unix_timestamp('value, format)).withColumn("servicedate_ts", $"servicedate_new".cast(TimestampType))
dateDF2.select("value","servicedate_new","servicedate_ts").show(false)

İki yeni sütun ekleyerek ve bu sütunlar için fonksiyonlar kullanarak iki yeni tarhi formatı oluşturalım. Birisi bigint diğeri ise timestamp olsun. Son olarak da yazdıralım. Sonuç çıktısı aşağıdaki gibi olacaktır.

import spark.implicits._
str_dates: List[String] = List(23.01.2013 08:50:21, 06.04.2015 11:16:25)
dateDF: org.apache.spark.sql.DataFrame = [value: string]
format: String = dd.MM.yyyy hh:mm:ss
dateDF2: org.apache.spark.sql.DataFrame = [value: string, servicedate_new: bigint ... 1 more field]
+-------------------+---------------+---------------------+
|value              |servicedate_new|servicedate_ts       |
+-------------------+---------------+---------------------+
|23.01.2013 08:50:21|1358923821     |2013-01-23 08:50:21.0|
|06.04.2015 11:16:25|1428308185     |2015-04-06 11:16:25.0|
+-------------------+---------------+---------------------+

Hoşçakalın…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Barkod Etiketi üretimi yapan firmaların işi ciddi bir iştir. Bu anlamda sizin de hangi firmayla çalışma yatığınız çok büyük önem taşır. Kullanım alanı sınırsızdır. Her alanda ve her sektörde bu etiketlere ihtiyaç duyulur. Etiket çeşitleri ve Barkod etiketleri, seri üretimle hazırlanmaktadır. Etiketler ahşap, plastik, metal ya da cam gibi ambalajlı ürünlerin üzerilerine ugulanır.
Mide botoksu midenin belirli yerlerine botoks maddesi enjekte etme suretiyle midedeki kasların çalışmasını sınırlandırmayı ve sayede midenin gıdaları sindirim sürecini yavaşlatarak buna bağlı olan açlık-tokluk hissi süresinin de uzatılmasını amaçlayan ameliyatsız kolay kilo verme tedavisidir. Botoks uygulanırken, midenin detaylı şekilde içerden görüntülenmesini sağlayan endoskopi uygulaması ile gerçekleştirilir. Bu sayede hastaya sadece gastroskpik uygulaması kadar bir rahatsızlık olur. Özellikle diyet programlarına ve düzenli egzersizlere uymakta zorlanan ve buna bağlı olarak da obeziteye yakalanan, bu yüzdende obezitenin sebep olduğu çeşitli sağlık sorunları olan kişiler için mide botoksu bir devrim niteliğindedir ve son yıllarda ülkemizde yaygın olarak kullanılmaktadır.
En güzel cami halısı dış avlusu olup bunun çevresi pencereli duvarlarla çevrilidir. Bu avulya 3 ü cephede olmak üzere, 8 kapıdan girilir. Şadırvan avlusu, 26 adet granit mermer ve porfir sütuna oturtulmuş, 30 kubbeyle çevrili geniş alandır. Mermer döşemeli bu geniş sahanın ortasında 6 mermer sütunlu şadırvan, sahanın azametini gösterir. Şadırvanın kemerleri, kabartma olarak Rumi geçmelerle ve köşebentleri, kabartma, lale ve karanfil motifleriyle bezelidir.
En güzel cami halısı dış avlusu olup bunun çevresi pencereli duvarlarla çevrilidir. Bu avulya 3 ü cephede olmak üzere, 8 kapıdan girilir. Şadırvan avlusu, 26 adet granit mermer ve porfir sütuna oturtulmuş, 30 kubbeyle çevrili geniş alandır. Mermer döşemeli bu geniş sahanın ortasında 6 mermer sütunlu şadırvan, sahanın azametini gösterir. Şadırvanın kemerleri, kabartma olarak Rumi geçmelerle ve köşebentleri, kabartma, lale ve karanfil motifleriyle bezelidir.
Termal Etiket Eco Termal etiket, yüzeyinde hami bir katman bulunmayan miktar çeşididir. Kumbara üzerine termal lamine edilmesi sonucunda oluşmaktadır. Kullanılan barkod yazıcının baş bölgesindeki ısı beraberlik birlikte termal sıvılaşma özelliği gösterir dahi bu şekilde Eco termal etiketin üzerine baskı alınır. Bu termal etiketlere yumruk termal olarak (ısıyla) yapılır ve yerde yüzden ribon kullanılmaz. Ribon kullanımı olmadığı için tahakküm maliyeti sıfıra yakındır.
Dijital Baskı ve baskı etiketi teknolojileri geliştikçe firmaların büyük ebatlı etiket ihtiyaçlarına da dijital çözümler sunulmaya başlamıştır. Böylece, birbirinden canlı renklerin ve kusursuz çizgilerin hakimiyetindeki büyük ebatlı dijital baskı etkileri; kurumsal firmaların reklam kampanyalarındaki en iddialı unsurlarına dönüşmüştür.