#scala #apache-spark-sql #spark-cassandra-connector
#scala #apache-spark-sql #кассандра #spark-cassandra-connector
Вопрос:
У меня есть дата в квадратных скобках [2014-11-08 06:27:00.0], и я хочу ее удалить.
Ожидаемый результат: 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. И какие проблемы у вас возникли с вашим текущим подходом?
2. Какой тип у вас есть / хотите, a
String
?3. Я добавил свой код в вопрос, так что, возможно, будет легче понять, что я пытаюсь сделать. После запуска кода я получаю массив дат, при сопоставлении этих дат я хочу удалить квадратные скобки.
4. Проверьте доступные методы для строки, которые удаляют символ, удаляют префикс / суффикс или метод substring
5. «dia, mes, horas, minutos» — не делай этого, чувак… представьте, если бы вы унаследовали код, написанный китайским мужчиной / женщиной …
Ответ №1:
Вы можете использовать .replaceAll
и регулярное выражение для удаления ненужных символов.
str.replaceAll("[\[\]]","")
удалит открывающие и закрывающие квадратные скобки из строки.
Ответ №2:
Решение заключается в следующем:
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)
Комментарии:
1. Совет:
string.replace
принимает регулярное выражение. Вы могли бы заменить все символы сразу вместо цепочки на.replace.replace.replace...
2. Рад, что это работает, но это ужасно многословно. Если вы просто удаляете все символы определенного набора, почему бы просто не отфильтровать их? Другими словами:
...toString().filterNot("[]()".contains(_))
3. Спасибо за помощь 🙂
Ответ №3:
dataset.select(«id»).distinct.as [Строка]. соберите отпечатки в виде массива строк, если вы используете Spark 2.0