通过Hadoop Streaming在PySpark中读取Xml文件

时间:2016-11-17 18:23:01

标签: pyspark 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

我可以使用不同的输入格式/设置使其正常工作吗?

1 个答案:

答案 0 :(得分:3)

最简单的解决方案是使用spark-xml包。在您的情况下(所有文档以<page>开头)代码下方将数据加载到数据帧中:

sqlContext.read.format('com.databricks.spark.xml')
    .options(rowTag='page').load('samplexml.xml')