当前位置: 首页 > 知识库问答 >
问题:

从以制表符分隔的csv创建数据帧,其中有些列是json类型,有些不是[duplicate]

胡高寒
2023-03-14

我试图创建一个火花数据帧(使用scala)从csv有这样的条目:这是一个单行条目5列:

{用户名:john_doe,id:123411}true 0 5{国家:IN,城市:BOM}

所以,有些列是JSON格式的,有些不是。我确实编写了一些代码,将JSON列作为字符串处理,并直接将它们作为字符串按行添加到数据帧中,但剩下的其他列我必须手动将它们添加到数据帧中,这是一个代价高昂的过程,因为我创建了一个单独的数据帧,向其中添加了一个“id”列,进行自然连接,每次删除“id”列。

任何帮助都将不胜感激!

共有1个答案

王才
2023-03-14

首先,您需要正确读取csv,这样json列就可以作为字符串读取。所以您可以这样做:

val csvSchema = StructType(Seq(StructField("info", StringType), StructField("boolean", BooleanType), ....))
val df = spark.read.option(...).schema(csvSChema).csv(...)

将完整模式构建到csvSchema中,设置相关选项(分隔符、标题)设置模式并读取csv。

生成的数据帧将在json列中包含字符串。现在我们可以将json转换为实际列:

 val s = StructType(StructField("username", StringType), StructField("id",StringType))

df.withColumn("info", from_json(df("info"), s))

结果将在新列中生成一个结构。

 类似资料:
  • 读取CSV文件。 基于记录子集(10-100行?),迭代地检查每行的每列,以自动确定CSV中数据的正确列类型。因此,如果第1行A列的值为12345(int),但第2行A列的值为ABC(varchar),系统将根据在前两次传递中找到的数据的组合自动确定它应该是varchar(5)格式。只要用户认为有必要确定列的可能类型和大小,这个过程就可以进行多少次。 按照CSV的列检查定义构建CREATE TAB

  • 假设,我有以下数据帧: 与 col1 不同的值(p1、p2、p3)单独具有 id,将用作最终数据帧的列。在这里,id y 对于相同的 col1 值 p2 有两个 col2 值(b2 和 b3),因此,p2 将被视为数组类型列。因此,最终的数据帧将是 如何从第一个数据帧高效地实现第二个数据帧?

  • 本文向大家介绍Mysql数据库表类型有哪些?相关面试题,主要包含被问及Mysql数据库表类型有哪些?时的应答技巧和注意事项,需要的朋友参考一下 MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。 MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。 InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。

  • 问题内容: 例如,我有以下列表: 并希望将其用“ |”分隔 所以结果看起来像: 我怎样才能做到这一点?我只在网上找到需要一定长度元素的子列表示例 问题答案:

  • 我想知道拥有包含几种类型的容器的方法。我知道那件事: 一个元组可以包含多种类型 如果我创建一个枚举 ,我可以创建一个

  • 字符串 hash list set zset