У меня есть файл журнала со структурой:
log_type time_stamp kvs
p 2019-06-05 18:53:20 us\tc\td\tus-xx-bb\th\ti-0b1\tvl\t20190605.1833\tvt\t20190605.1833\tvs\t20190508
p 2019-06-05 18:53:20 us\tc\td\tus-xx-bb\th\ti-03a\tvl\t20190605.1833\tvt\t20190605.1833
p 2019-06-05 18:53:20 us\tc\td\tus-xx-bb\th\ti-030
Мне нужно прочитать поле kvs, взломать ключи и превратить в отдельные столбцы, итоговый DataFrame должен выглядеть так:
log_type time_stamp us d h vl vt vs
p 2019-06-05 18:53:20 c us-xx-bb 0b1 20190605.1833 20190605.1833 20190508
p 2019-06-05 18:53:20 c us-xx-bb 03a 20190605.1833 20190605.1833
p 2019-06-05 18:53:20 c us-xx-bb 030
Очень важно, что количество ключей в kvs является динамическим, а имя ключей также является динамическим
Столбец kvs отделен \ t. Если мы разделяем столбец kvs, то элемент четного числа является заголовком, а элемент нечетного числа является значением.
Попытка состоит в том, чтобы прочитать файл журнала, создать кадр данных со схемой, основанной на всех строках, и использовать функцию write () для преобразования кадра данных в файл HDFS, но не знаете, как это сделать
val logSchema = new StructType().add("log_type",StringType).add("time_stamp",StringType).add("kvs",StringType)
val logDF = spark.read.option("delimiter", "\t").format("com.databricks.spark.csv").schema(logSchema).load("/tmp/log.tsv")
I have also tried
logDF.withColumn("pairkv", split($"kvs", "\t")).select(col("pairkv")(1) as "us" ,col("pairkv")(3) as "d" ,col("pairkv")(5) as "h" ,col("pairkv")(7) as "vl" ,col("pairkv")(9) as "vt" ,col("pairkv")(11) as "vs").show()
But no luck
Есть предложения?