支持的JSON数据选项介绍

json 是一种广泛采用的基于文本的信息格式,可在系统之间互操作,最常见于 web 应用程序。虽然 json 格式是人类可读的,但使用数据科学和数据工程工具处理它很复杂。
为了弥补这一差距, rapids cudf 提供了一个 gpu 加速的 json 读取器( cudf.read_json ),该读取器对于许多 json 数据结构都是高效和健壮的。 json format 指定了一种通用的树状数据结构, cudf 实现了算法,可以轻松地将 json 树转换为柱状数据。
cudf 是一个 gpu dataframe 库,用于在 python 中加载、连接、聚合、过滤和以其他方式操作数据。当 json 数据被构造为柱状数据时,它可以访问强大的 cudf dataframe api 。我们很高兴能够通过本读者打开 gpu 加速到更多数据格式、项目和建模工作流的可能性。
本文重点介绍了支持的 json 数据选项:面向记录的 json 和 json 行。以下是几个 cudf 读取器选项的示例,用于处理具有字节范围或多个源的 json 行文件。最后,您将学习如何使用 cudf 中的工具来展平 cudf 中的列表和结构类型,以及如何应用这些工具从常见的 json 模式组装 dataframe 。
在 cudf 中读取 json 数据
默认情况下, cudf json 读取器需要使用 records 方向的输入数据。面向记录的 json 数据由根级别的对象数组组成,数组中的每个对象对应一行。对象中的字段名决定表的列名。
json 数据的另一个常见变体是 json 行,其中 json 对象由换行符(n)分隔,每个对象对应一行。
以下代码示例显示了面向记录的 json 以及 json 行数据:
>>> j = '''[... {a: v1, b: 12},... {a: v2, b: 7},... {a: v3, b: 5}... ]'''>>> df_records = cudf.read_json(j)>>> j = 'n'.join([... '{a: v1, b: 12}',... '{a: v2, b: 7}',... '{a: v3, b: 5}'... ])>>> df_lines = cudf.read_json(j, lines=true)>>> df_lines a b0 v1 121 v2 72 v3 5>>> df_records.equals(df_lines)true  
cudf json 读取器还与嵌套的 json 对象和数组兼容,这些对象和数组大致映射到结构和列表 data types in cudf 。
以下示例演示了用于生成列表和结构列以及数据类型为列表和结构的任意组合的列的输入和输出。
# example with columns types:# list and struct>>> j = '''[... {list: [0, 1, 2], struct: {k: v1}}, ... {list: [3, 4, 5], struct: {k: v2}}... ]'''>>> df = cudf.read_json(j)>>> df list struct0 [0, 1, 2] {'k': 'v1'}1 [3, 4, 5] {'k': 'v2'}# example with columns types: # list> and struct, m:int>>>> j = 'n'.join([... '{a: [{k: 0}], b: {k: [0, 1], m: 5}}',... '{a: [{k: 1}, {k: 2}], b: {k: [2, 3], m: 6}}',... ])>>> df = cudf.read_json(j, lines=true)>>> df a b0 [{'k': 0}] {'k': [0, 1], 'm': 5}1 [{'k': 1}, {'k': 2}] {'k': [2, 3], 'm': 6}  
处理大小 json 行文件
对于基于 json lines 数据的工作负载, cudf 包括帮助数据处理的读取器选项:大文件的字节范围支持和小文件的多源支持。
字节范围支持
一些工作流,如欺诈检测和用户行为建模,需要处理可能超过 gpu 内存容量的大型 json line 文件。
cudf 中的 json 读取器支持字节范围参数,该参数指定起始字节偏移量和字节大小。读取器解析在字节范围内开始的每个记录,因此,字节范围不必与记录边界对齐。
在分布式工作流中,字节范围使每个工作人员能够处理数据的子集。在过滤和聚合中,字节范围允许单个工作人员以块的形式处理数据。
为了避免跳过行或读取重复的行,字节范围应该相邻,如下例所示。
>>> num_rows = 10>>> j = 'n'.join([... '{id:%s, distance: %s, unit: m/s}' % x ... for x in zip(range(num_rows), cupy.random.rand(num_rows))... ])>>> chunk_count = 4>>> chunk_size = len(j) // chunk_count + 1>>> data = []>>> for x in range(chunk_count):... d = cudf.read_json(... j, ... lines=true, ... byte_range=(chunk_size * x, chunk_size)... )... data.append(d) >>> df = cudf.concat(data)  
多源支持
相比之下,一些工作流需要处理许多小的 json 行文件。
cudf 中的 json 读取器接受数据源列表,而不是循环通过源并连接生成的 dataframe 。然后将原始输入作为单个源进行有效处理。
cudf 中的 json 读取器接受源作为文件路径、原始字符串或类似文件的对象,以及这些源的列表。
>>> j1 = '{id:0}n{id:1}n'>>> j2 = '{id:2}n{id:3}n'>>> df = cudf.read_json([j1, j2], lines=true)  
解包列表和结构数据
将 json 数据读入带有列表和结构列类型的 cudf dataframe 后,许多工作流的下一步是将数据提取或展平为简单类型。
对于结构列,一种解决方案是使用struct.explode访问器提取数据,并将结果连接到父 dataframe 。
下面的代码示例演示如何从结构列中提取数据。
>>> j = 'n'.join([... '{x: tokyo, y: {country: japan, iso2: jp}}',... '{x: jakarta, y: {country: indonesia, iso2: id}}',... '{x: shanghai, y: {country: china, iso2: cn}}'... ])>>> df = cudf.read_json(j, lines=true)>>> df = df.drop(columns='y').join(df['y'].struct.explode())>>> df x country iso20 tokyo japan jp1 jakarta indonesia id2 shanghai china cn  
对于元素顺序有意义的列表列,list.get访问器从特定位置提取元素。然后,可以将生成的cudf.series对象分配给 dataframe 中的新列。
下面的代码示例演示如何从列表列中提取第一个和第二个元素。
>>> j = 'n'.join([... '{name: peabody, ma, coord: [42.53, -70.98]}',... '{name: northampton, ma, coord: [42.32, -72.66]}',... '{name: new bedford, ma, coord: [41.63, -70.93]}'... ])>>> df = cudf.read_json(j, lines=true)>>> df['latitude'] = df['coord'].list.get(0)>>> df['longitude'] = df['coord'].list.get(1)>>> df = df.drop(columns='coord')>>> df name latitude longitude0 peabody, ma 42.53 -70.981 northampton, ma 42.32 -72.662 new bedford, ma 41.63 -70.93  
最后,对于长度可变的列表列,explode方法将创建一个新的 dataframe ,每个列表元素作为一行。将分解的 dataframe 连接到父 dataframe 上会产生一个具有所有简单类型的输出。
以下示例展平列表列,并将其连接到父 dataframe 中的索引和其他数据。
>>> j = 'n'.join([... '{product: socks, ratings: [2, 3, 4]}',... '{product: shoes, ratings: [5, 4, 5, 3]}',... '{product: shirts, ratings: [3, 4]}'... ])>>> df = cudf.read_json(j, lines=true)>>> df = df.drop(columns='ratings').join(df['ratings'].explode())>>> df product ratings0 socks 20 socks 40 socks 31 shoes 51 shoes 51 shoes 41 shoes 32 shirts 32 shirts 4  
使用 cudf 构建 json 数据解决方案
有时,工作流必须使用对象根处理 json 数据。 cudf 提供了为此类数据构建解决方案的工具。要使用对象根处理 json 数据,我们建议将数据作为单个 json 行读取,然后拆包生成的 dataframe 。
以下示例将 json 对象作为单行读取,然后将“ results ”字段提取到新的 dataframe 中。
>>> j = '''{... metadata : {vehicle:car},... results: [... {id: 0, distance: 1.2},... {id: 1, distance: 2.4},... {id: 2, distance: 1.7}... ]... }'''# first read the json object with lines=true>>> df = cudf.read_json(j, lines=true)>>> df metadata records0 {'vehicle': 'car'} [{'id': 0, 'distance': 1.2}, {'id': 1, 'distan...# then explode the 'records' column >>> df = df['records'].explode().struct.explode()>>> df id distance0 0 1.21 1 2.42 2 1.7  
关键要点
cudf json 读取器旨在加速广泛的 json 数据工作负载,包括跨大文件和小文件的简单和复杂类型。
这篇文章演示了 cudf json 读取器与面向记录和 json 行数据的常见用法,以及展示字节范围和多源支持。现在,您可以加快处理 json 数据的方式,并将 json 数据有效地结合到工作流中。

芯北科技同步降压转换器CN2020在制氧机上的应用
联想Z5拍照怎么样
据调查目前70%的全球受访企业未将提升女性地位列为业务重点
气密检漏仪:优质产品的保证
MTU值导致网络不通的原因是什么
支持的JSON数据选项介绍
华为荣耀8:双面玻璃,双摄像头,今年最美的华为手机还是它
小米手环4曝光_新增彩屏显示
Stream API原理介绍
哈尔滨大学开发微型光学结构纳米传感器,为我国卫星激光通信提高速率
中国企业85%数据中心PUE值在1.5至2.0
服务引爆市场,可穿戴设备能走多远?
Arduino怎样连接到电视以显示文本信息和图形
小米正式发布小爱音箱和小爱音箱Pro 售价分别为269元和299元
基于WDF的驱动开发
声扬科技荣登2023广东人工智能风云榜
A型N20减速箱制作方法
风向标携手汉威展开长期战略合作
如何利用51单片机同时扩展RAM和ROM
开漏输出_什么是开漏输出