Импорт данных XML в SQL-сервер MS программно

Краткий ответ: нет «принятого» способа сделать это, но вы можете сделать это очень элегантно с помощью рекурсивной функции, которая генерирует ваше утверждение 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):_*)
9
задан Joel Coehoorn 5 June 2009 в 21:18
поделиться

10 ответов

См. Это сообщение в блоге неофициального члена команды StackOverflow Брента Озара:
http://www.brentozar.com/archive/2009/06/how-to-import-the-stackoverflow -xml-into-sql-server /

3
ответ дан 4 December 2019 в 13:04
поделиться

Попробуйте бесплатную утилиту 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

... должно сработать, чтобы вы начали. Кроме того, помните, что документация появится в вашем меню «Пуск» рядом с исполняемым файлом после установки - я не думаю, что в сети есть хорошая копия.

4
ответ дан 4 December 2019 в 13:04
поделиться

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.

1
ответ дан 4 December 2019 в 13:04
поделиться

Я тщательно тестировал парсер 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

1
ответ дан 4 December 2019 в 13:04
поделиться
1
ответ дан 4 December 2019 в 13:04
поделиться

Первое, что я сделал, - это получил первые X байтов (например, первый 1 МБ) XML-файлов, чтобы я мог просмотреть их с помощью редактора по своему выбору.

Если у вас установлен Cygwin , у вас уже есть хорошая утилита GNU для этого: head

head.exe -c1M comments.xml > comments_small.xml

В качестве альтернативы вы можете найти собственный порт для большинства утилит GNU здесь: http : //unxutils.sourceforge.net/

1
ответ дан 4 December 2019 в 13:04
поделиться
​​

Для просмотра очень больших файлов я нашел Программа просмотра файлов V должна быть превосходной.

Я использовал ее для файлов размером до 8 ГБ. Для файлов с фиксированной длиной записи очень легко перемещаться по размеру блока, поскольку он основан на диске.

Обратите внимание, что нет возможности редактирования.

Сказав это, одна проблема с XML заключается в том, что это не совсем хороший формат для больших «потоков», поскольку он имеет общую структуру начала и конца,

0
ответ дан 4 December 2019 в 13:04
поделиться

Вам следует загрузить свой XML в базу данных XML , например, Berkeley DB XML или Xindice

Кроме того, я не конечно, если он может масштабироваться до 850 МБ, но First Object XML Editor и библиотека парсера, на которой он построен, могут обрабатывать довольно большие файлы.

Кроме того, Baretail должен отображать ваш файлы, не беспокоясь.

0
ответ дан 4 December 2019 в 13:04
поделиться

Пробовали ли вы использовать 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

0
ответ дан 4 December 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: