, лежащий в основе JSON String, является
"{ \"column_name1\":\"value1\",\"column_name2\":\"value2\",\"column_name3\":\"value3\",\"column_name5\":\"value5\"}";
Ниже приведен скрипт для фильтрации JSON и загрузки необходимых данных в Cassandra.
sqlContext.read.json(rdd).select("column_name1 or fields name in Json", "column_name2","column_name2")
.write.format("org.apache.spark.sql.cassandra")
.options(Map("table" -> "Table_name", "keyspace" -> "Key_Space_name"))
.mode(SaveMode.Append)
.save()
Трудно сказать без дополнительной информации о TaskCard
и других объектах, но вы должны попытаться объявить некоторую переменную final
и попытаться напечатать хеш-код для объекта, чтобы проверить, действительно ли он такой же instance или другие экземпляры, семантически равные:
for (Iterator<TaskCard> i = taskManager.getTaskCards().iterator(); i.hasNext();) {
TaskCard taskCard = i.next();
taskCard.updateTask();
ReturnInterface<String> returnInterface = new TaskReturnIterface(taskManager, taskCard);
Task task = taskCard.getTask();
// Mark this as "final" so you can use it as is in any internal anonymous class:
final ProtocolInterface selectedProtocol = task.getDevice().getSelectedProtocol();
selectedProtocol.setTask(task);
selectedProtocol.setReturnInterface(returnInterface);
System.out.println("[1] selectedProtocol device=" + selectedProtocol.getDevice().hashCode());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("[2] selectedProtocol device=" + selectedProtocol.getDevice().hashCode());
}
});
}
Казалось бы, есть некоторые связи между объектами, которые могут либо печатать один и тот же вывод, либо использовать один и тот же объект в бэкэнде. Особенно эта часть:
ProtocolInterface selectedProtocol = task.getDevice().getSelectedProtocol();
selectedProtocol.setTask(task);
selectedProtocol.setReturnInterface(returnInterface);
выглядит странно, поскольку selectedProtocol
кажется каким-то образом привязанным к самому устройству, привязанному к задаче, тогда вам придется снова ставить его задачу?
Это в основном делать task.getDevice().getSelectedProtocol().setTask(task)
, который выглядит так, как будто есть какая-то лазейка, которую вы должны проверить ...
Кроме того, SwingUtilities.invokeLater()
является своего рода зарезервированным для обработки графического интерфейса, так что вы можете захотеть удалить его (если он не выполняет GUI ...).
Да, ты прав! Вы создаете Runnable
экземпляр со ссылкой на объект протокола. Эта ссылка может быть изменена до тех пор, пока invokeLater
не выполнит эту задачу. Поэтому вам нужно скопировать необходимые данные вместо сохранения ссылки.
SwingUtilities.invokeLater(new Runnable() {
final Device device = selectedProtocol.getDevice();
@Override
public void run() {
System.out.println("[Taskmanager.TaskReturnInterface.actionPerformed.RUN()]selectedProtocol device= " + device);
}
});
Попробуйте это:
Iterator<TaskCard> i = taskManager.getTaskCards().iterator();
while (i.hasNext()) {
TaskCard taskCard = i.next();
taskCard.updateTask();
ReturnInterface<String> returnInterface = new TaskReturnIterface(taskManager, taskCard);
Task task = taskCard.getTask();
final ProtocolInterface selectedProtocol = task.getDevice().getSelectedProtocol();
selectedProtocol.setTask(task);
selectedProtocol.setReturnInterface(returnInterface);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("[Taskmanager.TaskReturnInterface.actionPerformed.RUN()]selectedProtocol device= " + selectedProtocol.getDevice());
}
});
}