Чтобы объединить ответы Дэвида Гриффена и В. Саммы, вы можете просто сделать это, чтобы сгладить, избегая дублирования имен столбцов:
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.Column
import org.apache.spark.sql.DataFrame
def flattenSchema(schema: StructType, prefix: String = null) : Array[Column] = {
schema.fields.flatMap(f => {
val colName = if (prefix == null) f.name else (prefix + "." + f.name)
f.dataType match {
case st: StructType => flattenSchema(st, colName)
case _ => Array(col(colName).as(colName.replace(".","_")))
}
})
}
def flattenDataFrame(df:DataFrame): DataFrame = {
df.select(flattenSchema(df.schema):_*)
}
var my_flattened_json_table = flattenDataFrame(my_json_table)
Да, но ничего не клонируется. Перед назначением один и тот же объект находится в обоих списках. После назначения у вас есть два уникальных объекта в двух списках.
Сделайте следующее:
list1[indexOfSomething].name = "SomeOtherName";
и объект в list2
также изменится.
Вы не клонируете объект; вы добавляете ссылку на один и тот же объект в два списка. Однако ваш код заменяет ссылку в одном из списков ссылкой на другой объект, так что да, это ожидаемое поведение.
// Declarations:
List<SomeType> list1 = new List<SomeType>();
List<SomeType> list2 = new List<SomeType>();
...
SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);
Помните, когда вы добавляете объект в список, вы на самом деле просто добавляете указатель на объект. В этом случае list1 и list2 оба указывают на один и тот же адрес в памяти.
list1[indexOfSomething] = new SomeType("SomeOtherName");
Теперь вы назначили элемент list1 другому указателю.
На самом деле вы не клонируете сами объекты, вы копируете указатели которые просто указывают на тот же объект. Если вам нужно доказательство, сделайте следующее:
SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);
list1[someIndex].SomeProperty = "Kitty";
bool areEqual = list1[someIndex].SomeProperty == list2[someIndex].SomeProperty;
areEqual
должно быть истинным. Указатели - рок!
Да, вы не клонируете объект. Первоначально объект добавляется в оба списка по ссылке, а затем вам назначается ссылка в списке на новый объект, который вы создаете.
Это определенно ожидаемый результат.
Когда вы передаете объект «что-то» в Add, вы передаете его по значению (по умолчанию в C #), а не по ссылке
замену ссылки в одном списке ссылкой на новый объект. Если бы вместо этого вы изменили свойство этого объекта, вы бы увидели, что оно изменилось в обоих местах, поскольку ссылка останется прежней.Да, это ожидаемо. Добавляется только ссылка на объект. Не сама ссылка и не копия.
Это потому, что json не имеет разницы между строковыми объектами и объектами Unicode. Это все строки в javascript.
Я думаю, JSON подходит для возврата объектов Unicode . На самом деле, я бы не принял ничего меньшего, поскольку строки javascript на самом деле являются объектами unicode
(т.е. строки JSON (javascript) могут хранить любой unicode) символ), поэтому имеет смысл создавать объекты unicode
при переводе строк из JSON. Простые строки просто не подходят, так как библиотеке придется угадывать нужную кодировку.
Лучше использовать строковые объекты unicode
везде. Поэтому лучше всего обновить библиотеки, чтобы они могли работать с объектами Unicode.
Но если вам действительно нужны строки байтов,