通过 Hadoop Streaming 在 PySpark 中读取 Xml 文件
Reading Xml file in PySpark via Hadoop Streaming
我正在尝试将代码 here 从 Scala 版本改编为 PySpark 版本。这是我正在使用的代码:
conf = SparkConf().setAppName("Parse Xml File")
sc = SparkContext(conf = conf)
sqlContext = HiveContext(sc)
sc._jsc.hadoopConfiguration().set('stream.recordreader.class', 'org.apache.hadoop.streaming.StreamXmlRecordReader')
sc._jsc.hadoopConfiguration().set('stream.recordreader.begin', '<page>')
sc._jsc.hadoopConfiguration().set('stream.recordreader.end', '</page>')
xml_sdf = sc.newAPIHadoopFile(xml_data_path,
'org.apache.hadoop.streaming.StreamInputFormat',
'org.apache.hadoop.io.Text',
'org.apache.hadoop.io.Text')
print("Found {0} records.".format(wiki_xml_sdf.count()))
sc.stop()
我得到的错误是:
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopFile.
: java.lang.ClassCastException: org.apache.hadoop.streaming.StreamInputFormat cannot be cast to org.apache.hadoop.mapreduce.InputFormat
我可以使用不同的输入格式/设置来使其工作吗?
最简单的解决方案是使用 spark-xml 包。在您的情况下(所有文档都以 <page>
开头),下面的代码会将数据加载到数据框中:
sqlContext.read.format('com.databricks.spark.xml')
.options(rowTag='page').load('samplexml.xml')
我正在尝试将代码 here 从 Scala 版本改编为 PySpark 版本。这是我正在使用的代码:
conf = SparkConf().setAppName("Parse Xml File")
sc = SparkContext(conf = conf)
sqlContext = HiveContext(sc)
sc._jsc.hadoopConfiguration().set('stream.recordreader.class', 'org.apache.hadoop.streaming.StreamXmlRecordReader')
sc._jsc.hadoopConfiguration().set('stream.recordreader.begin', '<page>')
sc._jsc.hadoopConfiguration().set('stream.recordreader.end', '</page>')
xml_sdf = sc.newAPIHadoopFile(xml_data_path,
'org.apache.hadoop.streaming.StreamInputFormat',
'org.apache.hadoop.io.Text',
'org.apache.hadoop.io.Text')
print("Found {0} records.".format(wiki_xml_sdf.count()))
sc.stop()
我得到的错误是:
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopFile.
: java.lang.ClassCastException: org.apache.hadoop.streaming.StreamInputFormat cannot be cast to org.apache.hadoop.mapreduce.InputFormat
我可以使用不同的输入格式/设置来使其工作吗?
最简单的解决方案是使用 spark-xml 包。在您的情况下(所有文档都以 <page>
开头),下面的代码会将数据加载到数据框中:
sqlContext.read.format('com.databricks.spark.xml')
.options(rowTag='page').load('samplexml.xml')