nasa电池数据集_Spark实战第二版(涵盖Spark3.0)第七章 从文件接入数据(续2)

关注公众号: 登峰大数据 ,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架! 如果您觉得作者翻译的内容有帮助,请分享给更多人。您的分享,是作者翻译的动力! 103aded4ce17e73e92bd2a609334db9b.png

7.5 接入多行JSON文件

从v2.2开始,Spark可以接收更复杂的JSON文件,并且不受JSON行格式的限制。本节将向您展示如何处理这些文件。

对于这个JSON数据接入例子,您将使用来自美国国务院领事事务局的旅行咨询数据。

实验

这是500号实验。您将要学习的示例是net.jgp.books .spark.ch07.lab500_json_multiline_ingestion.MultilineJsonToDataframeApp。领事事务局运营着一个基于CKAN的开放数据门户。CKAN是一个开源的开放数据门户;您可以通过https://ckan.org/了解更多关于CKAN的信息。可以通过https://cadatacatalog .state.gov/访问该局的门户网站。点击Travel链接,然后点击countrytravelinfo链接;然后单击Go to Resource按钮下载文件。

图7.5说明了这个过程。

2d72192e64181318060fc24158274b83.png

图7.5 Spark接入了一个JSON文件,其中记录分布在多行上。在接入之后,Spark将显示一些记录和模式。

下面的清单显示了该文件的摘录。出于可读性的考虑,我缩短了这段很长的描述。

#清单7.10国务院的旅行建议摘要[ {     "tag" : "A1" ,     "geopoliticalarea" : "Bonaire, Sint Eustatius, and Saba (BES) (Dutch Cari➥ bbean)" ,     "travel_transportation" : "

Road Conditions ..." ,

"health" : "

Medical care on the BES islands ..." ,

"local_laws_and_special_circumstances" : "

..." ,

"entry_exit_requirements" : "

All U.S. citizens must..." ,

"destination_description" : "

The three islands of Bonaire..." ,

"iso_code" : "" , "travel_embassyAndConsulate" : "
"last_update_date" : "Last Updated: September 21, 2016 "}, { "tag" : "A2" , "geopoliticalarea" : "French Guiana" , "travel_transportation" : "

Road Conditions and ..." ,

"local_laws_and_special_circumstances" : "

Criminal Penalties..." ,

"safety_and_security" : "

French Guiana is an overseas department..." ,

"entry_exit_requirements" : "

Visit the..." ,

"destination_description" : "

French Guiana is an overseas..." ,

"iso_code" : "GF" , "travel_embassyAndConsulate" : "
"last_update_date" : "Last Updated: October 12, 2017 " }, ... ]

如您所见,这是一个相当基本的JSON文件,其中包含一个对象数组。每个对象都有简单的键/值对。一些字段的内容包含HTML格式的富文本或非标准格式的日期(JSON日期应该与RFC 3339匹配),这使得提取信息有点复杂。但我敢肯定你在日常项目中也见过类似的例子。

7.5.1 期望的输出

下面的清单显示了旅游咨询的摘要输出。我删除了一些列以适合本页的代码。

#清单7.11国务院的旅行建议摘要+-----------------------+-----------------------+--------------------+---...|destination_description|entry_exit_requirements| geopoliticalarea   | ...+-----------------------+-----------------------+--------------------+---...| 

The three isla... |

All U.S. citiz... |Bonaire, Sint Eus...|

...

|

French Guiana ... |

Visit the&nbsp... | French Guiana|

...

|

See the Depart... |

Passports a... | St Barthelemy|

...

|

Read the Depar... |

Upon arrival i... | Aruba|

...

|

See the Depart... |

Passports a... | Antigua and Barbuda|

...

+-----------------------+-----------------------+--------------------+---...only showing top 5 rowsroot |-- destination_description: string (nullable = true) |-- entry_exit_requirements: string (nullable = true) |-- geopoliticalarea: string (nullable = true) |-- health: string (nullable = true) |-- iso_code: string (nullable = true) |-- last_update_date: string (nullable = true) |-- local_laws_and_special_circumstances: string (nullable = true) |-- safety_and_security: string (nullable = true) |-- tag: string (nullable = true) |-- travel_embassyAndConsulate: string (nullable = true) |-- travel_transportation: string (nullable = true)7.5.2 代码

下面的清单显示了处理国务院旅游咨询所需的Java代码。

#Listing 7.12 MultilineJsonToDataframeApp.javapackage net.jgp.books.spark.ch07.lab500_json_multiline_ingestion;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SparkSession;public clas s MultilineJsonToDataframeApp {     public static void main(String[] args ) {      MultilineJsonToDataframeApp app =             new MultilineJsonToDataframeApp();       app .start();    }     private void start() {      SparkSession spark = SparkSession.builder()            .appName( "Multiline JSON to Dataframe" )            .master( "local" )            .getOrCreate();      Dataset df = spark .read()            .format( "json" )            .option( "multiline" , true )            .load( "data/countrytravelinfo.json" );       df .show(3);       df .printSchema();    } }

如果您忘记了multiline选项,您的dataframe将由一个名为_corrupt_record的列组成:

+--------------------+| _corrupt_record    |+--------------------+| [ {                || "tag" : "A1",      || "geopoliticalar... |+--------------------+ only showing top 3 rows
7.6 接入XML文件

在本节中,您将获取一个包含美国国家航空航天局(NASA)专利的可扩展标记语言(XML)文档,然后显示一些专利和dataframe的模式。注意,在此上下文中,模式不是XML模式(或XSD),而是dataframe模式。几年前,当我发现XML时,我真的认为它可以成为数据交换的统一语言。XML可以这样描述:

结构化可扩展的自描述通过文档类型定义(DTD)和XML模式定义(XSD)嵌入验证规则W3标准

可以在https://www.w3.org/XML/阅读更多关于XML的信息。XML看起来像HTML和任何其他标记语言,因为SGML:

          Some payload in a text element         

不幸的是,XML比JSON冗长且难以阅读。然而,XML仍然被广泛使用,Apache Spark很好地吸收了它。

实验

这里是600号实验。您将要学习的示例是net.jgp.books .spark.ch07.lab600_xml_ingestion.XmlToDataframeApp。

图7.6显示了XML文件的一个片段并说明了这个过程。

对于这个XML示例,您将使用NASA的专利数据。美国宇航局在https://data.nasa.gov上提供各种公开数据集。清单7.13显示了该文件的一条记录。

750947fd6699f666c6b0e8e2b41fd33b.png

图7.6 Spark接入了一个包含NASA专利的XML文件。Spark使用Databricks提供的外部插件来执行读取。Spark随后将显示记录和dataframe模式(不要与XML模式混淆)。

实验

您可以从https://data.nasa .gov/Raw-Data/NASA-Patents/gquh-watm下载NASA专利数据集。对于本例,我在Mac OS X v10.12.6和Java 8上使用了Spark v2.2.0,以及Databricks XML解析器v0.4.1。该数据集于2018年1月下载。

#清单7.13 NASA专利(节选)             _ id = "1"        _ uuid = "BAC69188-84A6-4D28-951E-FC687ACB6D4A"        _ position = "1"        _ address = " https://data.nasa.gov/resource/nasa-patents/1 " >       
NASA Ames Research Center
Issued ARC-14048-1 5694939 08/543,093 Autogenic-Feedback Training Exercise Method & System 2015-10-03T00:00:00 ...

7.6.1期望的输出

清单7.14显示了作为XML文档接收NASA专利后dataframe的数据和模式的输出。您可以看到,属性以一个下划线作为前缀(在原始文档中,属性已经有一个下划线作为前缀,所以现在它们有两个),并且元素的名称用作列名。

+--------------------+----+----------+--------------------+--------------+...| __address          |__id|__position| __uuid             |application_sn|...+--------------------+----+----------+--------------------+--------------+...|https://data.nasa...| 407| 407      |2311F785-C00F-422...| 13/033,085   |...|https://data.nasa...| 1  | 1        |BAC69188-84A6-4D2...| 08/543,093   |...|https://data.nasa...| 2  | 2        |23D6A5BD-26E2-42D...| 09/017,519   |...|https://data.nasa...| 3  | 3        |F8052701-E520-43A...| 10/874,003   |...|https://data.nasa...| 4  | 4        |20A4C4A9-EEB6-45D...| 09/652,299   |...+--------------------+----+----------+--------------------+--------------+...only showing top 5 rowsroot  |-- __address: string (nullable = true)  |-- __id: long (nullable = true)  |-- __position: long (nullable = true)  |-- __uuid: string (nullable = true)  |-- application_sn: string (nullable = true)  |-- case_number: string (nullable = true)  |-- center: string (nullable = true)  |-- patent_expiration_date: string (nullable = true)  |-- patent_number: string (nullable = true)  |-- status: string (nullable = true)   |-- title: string (nullable = true)

7.6.2 代码

通常,我们的代码将从一个main()方法开始,该方法调用一个start()方法来创建一个Spark会话。下面的清单是读取NASA XML文件并显示5条记录及其模式所需的Java代码。

Listing 7.15 XmlToDataframeApp.javapackage net.jgp.books.spark.ch07.lab600_xml_ingestion;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SparkSession;public class XmlToDataframeApp {     public static void main(String[] args ) {      XmlToDataframeApp app = new XmlToDataframeApp();       app .start();    }     private void start() {      SparkSession spark = SparkSession.builder()            .appName( "XML to Dataframe" )            .master( "local" )            .getOrCreate();      Dataset df = spark .read().format( "xml" )            .option( "rowTag" , "row" )            .load( "data/nasa-patents.xml" );       df .show(5);       df .printSchema();    } }

我必须修改原始的NASA文档,因为它包含了一个与记录同名的元素,包装了记录。不幸的是,到目前为止,Spark还不能为我们更改这个元素的名称。原结构如下:

                    ...             ...       

如果response的第一个子元素是row,或者是row以外的任何元素,我就不必删除它(另一个选项是重命名它)。

因为解析器不是标准Spark分发的一部分,所以必须将它添加到pom.xml文件中,如下面的清单所示。要吸收XML,您将使用Databricks 0.7.0版本中的spark-xml_2.12(工件)。

...     ...        2.12         0.7.0           ...                 com.databricks           spark-xml_${scala.version}           ${spark-xml.version}                                       org.slf4j                 slf4j-simple                              ...      ...

更多关于Spark XML的细节可以在https://github.com/databricks/spark-xml找到。

7.7 接收文本文件

尽管文本文件在企业应用程序中不那么流行,但它们仍然被使用,因此您将不时地看到它们。深度学习和人工智能的日益普及也推动了更多的自然语言处理(NLP)活动。在本节中,您将不执行任何NLP,而只是接入文本文件。要了解更多关于NLP的信息,请参见Hobson Lane、Cole Howard和Hannes Max Hapke的《自然语言处理实战》(Manning, 2019)。

(未完待续......)  欢迎关注公众号,及时获得最新翻译内容:

805fc6f3c7cab59a221f3b5ad505e635.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值