Не совсем, но вы можете сделать что-то подобное, используя Spark XML API или API-интерфейс XStream в Spark.
Сначала попробуйте использовать Spark XML API , который наиболее полезен при чтении и записи файлов XML с использованием Spark. Однако на момент написания этой статьи Spark XML имел следующие ограничения.
1) Adding attribute to root element has not supported.
2) Does not support following structure where you have header and footer elements.
suports xml tags and data here
value2
Если у вас есть один корневой элемент и следующие данные, то Spark XML - это api.
Кроме того, вы можете посмотреть на XStream API . Ниже приведены инструкции по его использованию для создания пользовательских структур XML.
1) Сначала создайте класс Scala, подобный структуре, которую вы хотели в XML.
case class XMLData(name:String, value:String, attr:String)
2) Создать экземпляр этого класса
val data = XMLData("bookName","AnyValue", "AttributeValue")
3) Преобразовать объект данных в XML с помощью API XStream. Если у вас уже есть данные в DataFrame, выполните преобразование карты, чтобы преобразовать данные в строку XML и сохранить их обратно в DataFrame. если вы это сделаете, то можете пропустить шаг # 4
val xstream = new XStream(new DomDriver)
val xmlString = xstream.toXML(data)
4) Теперь преобразовать xmlString в DataFrame
val df = xmlString.toDF()
5) Наконец, записать в файл
[115 ]
Вот полный пример с API-интерфейсом XStream
import com.thoughtworks.xstream.XStream
import com.thoughtworks.xstream.io.xml.DomDriver
import org.apache.spark.sql.SparkSession
case class Animal(cri:String,taille:Int)
object SparkXMLUsingXStream{
def main(args: Array[String]): Unit = {
val spark = SparkSession.
builder.master ("local[*]")
.appName ("sparkbyexamples.com")
.getOrCreate ()
var animal:Animal = Animal("Rugissement",150)
val xstream1 = new XStream(new DomDriver())
xstream1.alias("testAni",classOf[Animal])
xstream1.aliasField("cricri",classOf[Animal],"cri")
val xmlString = Seq(xstream1.toXML(animal))
import spark.implicits._
val newDf = xmlString.toDF()
newDf.show(false)
}
}
Надеюсь, что это поможет !!
Спасибо
Измененная версия ответа kobor42, с производительностью, улучшенной фактором 2-3 путем чтения фиксированного размера, разделяет на блоки вместо "строк":
def crc32(fileName):
fh = open(fileName, 'rb')
hash = 0
while True:
s = fh.read(65536)
if not s:
break
hash = zlib.crc32(s, hash)
fh.close()
return "%08X" % (hash & 0xFFFFFFFF)
Также включает продвижение, обнуляет в возвращаемой строке.
Чтобы показать самые младшие 32 бита любого целого числа как 8 шестнадцатеричных цифр без знака, вы можете «замаскировать» значение битовой и 'маской, состоящей из 32 бит, все в значении 1 , затем примените форматирование. То есть:
>>> x = -1767935985
>>> format(x & 0xFFFFFFFF, '08x')
'969f700f'
Совершенно неважно, получено ли целое число, которое вы форматируете таким образом, из zlib.crc32
или любого другого вычисления вообще.
решение:
import os, sys
import zlib
def crc(fileName, excludeLine="", includeLine=""):
try:
fd = open(fileName,"rb")
except IOError:
print "Unable to open the file in readmode:", filename
return
eachLine = fd.readline()
prev = None
while eachLine:
if excludeLine and eachLine.startswith(excludeLine):
continue
if not prev:
prev = zlib.crc32(eachLine)
else:
prev = zlib.crc32(eachLine, prev)
eachLine = fd.readline()
fd.close()
return format(prev & 0xFFFFFFFF, '08x') #returns 8 digits crc
for eachFile in sys.argv[1:]:
print crc(eachFile)
на самом деле не знаю, что такое (excludeLine = "", includeLine = "") ...
Вы можете использовать base64 для выхода, как [ERD45FTR]. И zlib.crc32 предоставляет параметры обновления.
import os, sys
import zlib
import base64
def crc(fileName):
fd = open(fileName,"rb")
content = fd.readlines()
fd.close()
prev = None
for eachLine in content:
if not prev:
prev = zlib.crc32(eachLine)
else:
prev = zlib.crc32(eachLine, prev)
return prev
for eachFile in sys.argv[1:]:
print base64.b64encode(str(crc(eachFile)))
Немного более компактный и оптимизированный код
def crc(fileName):
prev = 0
for eachLine in open(fileName,"rb"):
prev = zlib.crc32(eachLine, prev)
return "%X"%(prev & 0xFFFFFFFF)
PS2: Старый PS устарел - поэтому удален - из-за предложения в комментарии. Спасибо. Не понимаю, как я это пропустил, но это было действительно хорошо.