2016-10-10 3 views
0

У меня есть дата с квадратными скобками [2014-11-08 06: 27: 00.0] и хотите удалить его.Выньте квадратные скобки [] из массива в scala

Ожидаемый выход 2014-11-08 06: 27: 00,0

val conf = new SparkConf(true) 
    .set("spark.cassandra.connection.host", "127.0.0.1").setAppName("CasteDate").setMaster("local[*]") 
    .set("spark.cassandra.connection.port", "9042") 
    .set("spark.driver.allowMultipleContexts", "true") 
    .set("spark.streaming.receiver.writeAheadLog.enable", "true") 

val sc = new SparkContext(conf) 

val ssc = new StreamingContext(sc, Seconds(1)) 
val csc=new CassandraSQLContext(sc) 

val sqlContext = new org.apache.spark.sql.SQLContext(sc) 

var input: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S") 
input.setTimeZone(TimeZone.getTimeZone("GMT")) 
var dia: SimpleDateFormat = new SimpleDateFormat("dd") 
var mes: SimpleDateFormat = new SimpleDateFormat("MM") 
var ano: SimpleDateFormat = new SimpleDateFormat("yyyy") 
var horas: SimpleDateFormat = new SimpleDateFormat("HH") 
var minutos: SimpleDateFormat = new SimpleDateFormat("mm") 

val data=csc.sql("SELECT timecol from smartgrids.analyzer_temp").collect() 

import sqlContext.implicits._ 

val result = data.map(row => { 
         val day = dia.format(input.parse(row.toString())) 
         val month = mes.format(input.parse(row.toString())) 
         val year = ano.format(input.parse(row.toString())) 
         val hour = horas.format(input.parse(row.toString())) 
         val minute = minutos.format(input.parse(row.toString())) 
          }) 

val collection = sc.parallelize(Seq(("day", 2), ("month", 2), ("year", 4), ("hour", 2), ("minute", 2))) 
collection.saveToCassandra("features", "datepart", SomeColumns("day", "month", "year", "hour", "minute")) 
sc.stop()   

После выполнения этого кода я получаю ошибку:

java.text.ParseException: Unparseable date: "[2015-08-20 21:01:00.0]" 
    at java.text.DateFormat.parse(DateFormat.java:366) 

Я думаю, что эта ошибка происходит потому, что дата имеет квадратные скобки, поэтому я хочу удалить его.

+1

, а какие проблемы вы имеете с вашим текущим подходом? – Yawar

+0

Какой тип у вас есть, 'String'? –

+0

Я добавил свой код на вопрос, так что может быть проще понять, что я пытаюсь сделать. После запуска кода я получаю массив дат, когда намечаю эти даты, я хочу удалить квадратные скобки. –

ответ

3

Вы можете использовать .replaceAll и регулярное выражение для удаления нежелательных символов.

str.replaceAll("[\\[\\]]","") 

удаляет открывающие и закрывающие квадратные скобки из строки.

+0

Спасибо за регулярное выражение. Кстати, есть дополнительные скобки в конце не нужны – Davos

+1

Спасибо. Обновился. –

1

Решение следующее:

val result = data.map(row => { 
    val day = dia.format(input.parse(row.toString().replace("[", "").replace("]", "").replace("(", "").replace(")", ""))) 
    val month = mes.format(input.parse(row.toString().replace("[", "").replace("]", "").replace("(", "").replace(")", "")))          
    val year = ano.format(input.parse(row.toString().replace("[", "").replace("]", "").replace("(", "").replace(")", "")))           
    val hour = horas.format(input.parse(row.toString().replace("[", "").replace("]", "").replace("(", "").replace(")", "")))          
    val minute = minutos.format(input.parse(row.toString().replace("[", "").replace("]", "").replace("(", "").replace(")", ""))) 
}) 

Я проверил его и он работает.

Дата ввода:

data: Array[org.apache.spark.sql.Row] = Array([2015-08-20 21:01:00.0] 

выход:

Array(List(20, 08, 2015, 21, 01) 
+2

Совет: 'string.replace' принимает регулярное выражение. Вы можете заменить все символы одновременно, а не на цепочку на .replace.replace.replace ... ' –

+1

Рад, что это работает, но это ужасно многословие. Если вы просто удаляете все символы определенного набора, почему бы просто не отфильтровать их? Другими словами: '... toString(). FilterNot (" []() "содержит (_))' – jwvh

+0

Спасибо за помощь :) –

0

dataset.select ("идентификатор"). Distinct.as [String] .collect печатает, как массив строк, если вы используете Спарк 2.0

Смежные вопросы