【问题标题】:Pyspark convert complex DataformatPyspark 转换复杂的数据格式
【发布时间】:2018-11-29 09:08:39
【问题描述】:

用 spark 读取 parquet 文件

df = spark.read.parquet("path_to_file")
df.show(2)

我的 df 包含

**Output**

+------+-----------------+
| col1 |       col2      |
+------+-----------------+
| "A1" |  {"x":1,"y":2}  |
+------+-----------------+
| "A2" |  {"z":3}        |
+------+-----------------+

我想将数据框转换为喜欢

+------+------+------+------+
| col1 |  x   |  y   |  z   |
+------+------+------+------+
| "A1" |  1   |  2   | Null |
+------+------+------+------+
| "A2" | Null | Null |  3   |
+------+------+------+------+

初始数据框的模式显示

DataFrame[col1: string, col2: string]

我在 Windows 7 机器上使用 pyspark 2.3.2

【问题讨论】:

  • 你只有 x,y 和 z 或者你可以有很多不同的值?你有一份详尽的价值观清单吗?
  • col2 的内容是 JSON 编码为字符串数据,Spark 对此一无所知,您需要解析该列的内容
  • @Steven 我在 col2 中没有固定长度的数据,所以如果有一些新键(例如 'w')进来,我想将其添加为新列
  • 你的 spark 版本是什么?

标签: python pyspark apache-spark-sql pyspark-sql parquet


【解决方案1】:

这个解决方案并不完全符合您的要求,但也许您不这么认为。因此,如果不适合您,请添加 cmets。

> from pyspark.sql import functions as F
> from pyspark.sql.types import *

> df.show()
+----+-------------+
|col1|         col2|
+----+-------------+
|  A1|{"x":1,"y":2}|
|  A2|      {"z":3}|
+----+-------------+

> df.printSchema()
root
 |-- col1: string (nullable = true)
 |-- col2: string (nullable = true)

> df = df.withColumn(
..  "col2",
..  F.from_json("col2", MapType(StringType(),IntegerType()))
..)

> df.show()
+----+----------------+
|col1|            col2|
+----+----------------+
|  A1|[x -> 1, y -> 2]|
|  A2|        [z -> 3]|
+----+----------------+

> df.select(
..    "col1",
..    "col2.x",
..    "col2.y",
..    "col2.z",
..).show()
+----+----+----+----+
|col1|   x|   y|   z|
+----+----+----+----+
|  A1|   1|   2|null|
|  A2|null|null|   3|
+----+----+----+----+

【讨论】:

  • 该解决方案对我来说是可行的,但出现此错误 Py4JJavaErrorAn error occurred while calling o2628.withColumn. : org.apache.spark.sql.AnalysisException: cannot resolve 'jsontostructs(col2)' due to data type mismatch: Input schema map<string,int> must be a struct or an array of structs.;;
  • @TusharKolhe 您提供的示例数据可能过于简单。您的真实情况是我认为要复杂得多,而我的简单解决方案还不够!请提供真实案例。
  • 我认为错误状态我们无法提供类型映射的架构(我们将其设置为 Maptype(StringType(),IntergerType())) ,而是需要 StructType()
  • @TusharKolhe 如果您使用我的解决方案尝试您自己的示例,它是否有效?错误是发生还是仅发生在您的真实数据集上?如果您对示例有错误,那是版本问题。如果您的数据集仅存在错误,我需要有关您的数据的更多信息。
  • 样本数据也出现错误。我在 Windows 7 机器上使用 pyspark 2.3.2
猜你喜欢
  • 2020-08-06
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多