У меня есть вариант использования, когда мне нужно внести некоторые исправления в уже загруженные данные. Учитывая, что метаданные находятся в hbase с логическими первичными ключами в одном семействе столбцов и columnUpdates в другом семействе столбцов. Предположим, что у меня есть отфильтрованный кадр данных с одной записью, для которой мне нужно выполнить обновление (отфильтровано с помощью искры sql). colNames и значения Colvalues находятся на карте java. Я знал, что мы можем применить withColunmm для обновления или добавления новый столбец для существующего DF, но в этом случае мне нужно применить withColumn несколько раз на основе моих метаданных, т. е. количество столбцов, для которых необходимо исправить данные. я не могу сделать это в цикле for, повторяя map, поскольку кадры данных являются неизменяемыми, а также мне не рекомендуется использовать случай переключения. Также есть ограничение, которое не должно использовать scala API.
Dataset<Row> existingdata = sparksession.read
.format(com.databricks.spark.avro)
.load(myhdfslocation);
Map<byte[],byte[]> colUpdates = result.getFamily("TK")//result of hbase get
Set<byte[]> colUpdateKeys = colUpdates.keySet();
for(byte[] eachkey : colUpdateKeys ){
Dataset<Row> updatedDF =
existingdata.withColumn(
existingdata.col(Bytes.toString(eachkey)),
"value from themetadatamap"
);
}
Пока у меня есть 2 подхода: один использует случай переключения (что не оптимально, поскольку это не очень хороший способ сохранить так много случаев переключения), а другой читает метаданные hbase как искровой фрейм данных, а затем применяет искровые соединения. чтобы получить результирующий набор данных. Если кто-нибудь может предложить лучший способ реализовать этот вариант использования, это будет действительно полезно. :)
"value from themetadatamap"
из того же фрейма данныхexistingdata
? - person ernest_k   schedule 21.04.2018existingdata = existingdata.withColumn()
создаст новый фрейм данных на основе старого, а затем перезапишет значение переменной. - person ernest_k   schedule 21.04.2018