#scala #apache-spark #cassandra #rdd #spark-cassandra-connector
#scala #apache-искра #кассандра #rdd #spark-cassandra-connector #apache-spark
Вопрос:
Мне нужно отфильтровать таблицу Cassandra в spark, после получения данных из таблицы через spark применить функцию фильтра к возвращенному rdd, мы не хотим использовать предложение where в cassandra api, которое может фильтровать, но для которого требуется пользовательский индекс sasi в столбце фильтра, из-за чего возникают проблемы с дисковыми нагрузками из-за многократного сканирования таблицы ss в cassandra. например:
val ct = sc.cassandraTable("keyspace1", "table1")
val fltr = ct.filter(x=x.contains "zz")
поля table1 являются :
- dirid uuid
- текст имени файла
- событие int
- bigint метки времени события
- fileid int
- тип файла int
В основном нам нужно фильтровать данные на основе имени файла с произвольной строкой. поскольку возвращаемый rdd имеет тип com.datastax.spark.connector.rdd.CassandraTableScanRDD[com.datastax.spark.connector.CassandraRow] = CassandraTableScanRDD
, а операции фильтрации ограничены только методами CassandraRow
типа, которые являются здесь введите описание изображения
val ct = sc.cassandraTable("keyspace1", "table1")
scala> ct
res140: com.datastax.spark.connector.rdd.CassandraTableScanRDD[com.datastax.spark.connector.CassandraRow] = CassandraTableScanRDD[171] at RDD at CassandraRDD.scala:19
когда я нажимаю tab после «x». в приведенной ниже функции фильтра, которая показывает приведенные ниже методы класса CassandraRow, введите код здесь
scala> ct.filter(x=>x.
columnValues getBooleanOption getDateTime getFloatOption getLongOption getString getUUIDOption length
contains getByte getDateTimeOption getInet getMap getStringOption getVarInt metaData
copy getByteOption getDecimal getInetOption getRaw getTupleValue getVarIntOption nameOf
dataAsString getBytes getDecimalOption getInt getRawCql getTupleValueOption hashCode size
equals getBytesOption getDouble getIntOption getSet getUDTValue indexOf toMap
get getDate getDoubleOption getList getShort getUDTValueOption isNullAt toString
getBoolean getDateOption getFloat getLong getShortOption getUUID iterator
Ответ №1:
Вам нужно получить строковое поле из CassandraRow
объекта, а затем выполнить фильтрацию по нему. Итак, этот код будет выглядеть следующим образом:
val fltr = ct.filter(x => x.getString("filename").contains("zz"))
Комментарии:
1. Да, это то, что я пробовал — val fltr = ct.filter(x => x.getStringOption(«filename»).contains(«zz»)) и теперь он работает нормально. Также просто хочу подтвердить, ищет ли метод contains поиск по шаблону? если я хочу получить имя файла, имеющее такие значения, как «/d/newfile.txt » и так далее, моим условием поиска было бы «подобное имя файла» *.txt
2.
.getString
предоставляет вам стандартныйString
класс, так что вы можете использовать любые функции, такие как регулярные выражения и т.д.