Краткий ответ: нет «принятого» способа сделать это, но вы можете сделать это очень элегантно с помощью рекурсивной функции, которая генерирует ваше утверждение select(...)
, пройдя по DataFrame.schema
.
Рекурсивная функция должна возвращать Array[Column]
. Каждый раз, когда функция попадает в StructType
, она вызывает себя и добавляет возвращенный Array[Column]
к своему собственному Array[Column]
.
Что-то вроде:
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))
}
})
}
Затем вы бы использовали это так:
df.select(flattenSchema(df.schema):_*)
См. Это сообщение в блоге неофициального члена команды StackOverflow Брента Озара:
http://www.brentozar.com/archive/2009/06/how-to-import-the-stackoverflow -xml-into-sql-server /
Попробуйте бесплатную утилиту LogParser от Microsoft: http://www.microsoft.com/DownLoads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=en
Он разработан, чтобы предоставить вам доступ в стиле SQL к большим текстовым файлам, включая XML. . Что-то вроде
Select top 1000 * from myFile.xml
... должно сработать, чтобы вы начали. Кроме того, помните, что документация появится в вашем меню «Пуск» рядом с исполняемым файлом после установки - я не думаю, что в сети есть хорошая копия.
You kind of have to know the schema. Try downloading TextPad or something similar to view the files.
Once you know the schema you can do a couple of things to get them into SQL. One approach would be to use OpenXML http://msdn.microsoft.com/en-us/library/ms186918.aspx.
Я тщательно тестировал парсер mssql xml, утилита bcp.exe отлично подходит для этого . Хитрость заключается в том, чтобы выбрать правильный терминатор строки, поскольку это должно быть значение, которое не может встретиться в вашем документе. Например, вы можете сделать это:
create table t1(x xml)
Создайте простой текстовый файл, содержащий только только выбранный вами разделитель. Например, поместите эту строку в delim.txt:
- ++++++++ -
Затем объедините ее в конец экземпляра документа из командной строки:
скопируйте myFile.xml + delim.txt out.xml / b
После этого вы можете использовать BCP в базе данных, например:
bcp. -r - ++++++++ -
Если документ UTF-16, замените переключатель -c на -w
Первое, что я сделал, - это получил первые X байтов (например, первый 1 МБ) XML-файлов, чтобы я мог просмотреть их с помощью редактора по своему выбору.
Если у вас установлен Cygwin , у вас уже есть хорошая утилита GNU для этого: head
head.exe -c1M comments.xml > comments_small.xml
В качестве альтернативы вы можете найти собственный порт для большинства утилит GNU здесь: http : //unxutils.sourceforge.net/
Для просмотра очень больших файлов я нашел Программа просмотра файлов V должна быть превосходной.
Я использовал ее для файлов размером до 8 ГБ. Для файлов с фиксированной длиной записи очень легко перемещаться по размеру блока, поскольку он основан на диске.
Обратите внимание, что нет возможности редактирования.
Сказав это, одна проблема с XML заключается в том, что это не совсем хороший формат для больших «потоков», поскольку он имеет общую структуру начала и конца,
Взгляните на этот пост http://benchmarkitconsulting.com/colin-stasiuk/2009/01/15/parsing-xml-into-a-table-structure- possible-update /
И вот такой вопрос: Разбор XML в таблицу SQL БЕЗ предопределения структуры. Возможно?
Вам следует загрузить свой XML в базу данных XML , например, Berkeley DB XML или Xindice
Кроме того, я не конечно, если он может масштабироваться до 850 МБ, но First Object XML Editor и библиотека парсера, на которой он построен, могут обрабатывать довольно большие файлы.
Кроме того, Baretail должен отображать ваш файлы, не беспокоясь.
Пробовали ли вы использовать OPENROWSET
для импорта больших файлов XML в таблицу SQL Server?
CREATE TABLE XmlTable
(
ID INT IDENTITY,
XmlData XML
)
INSERT XmlTable(XmlData)
SELECT * FROM
OPENROWSET(BULK '(your path)\xmldata.xml',
SINGLE_BLOB
) AS X
Так как у меня под рукой нет файлов размером 5 ГБ, я не могу проверить это сам.
Есть еще один способ решить эту проблему: потоковая передача Linq-To-Xml. Посмотрите это сообщение в блоге , где Джеймс Ньютон-Кинг показывает, как читать XElement один за другим, и серию из двух частей здесь и здесь на та же тема в блоге группы Microsoft XML.
Marc