相关疑难解决方法(0)

查询具有复杂类型的Spark SQL DataFrame

如何查询具有复杂类型(如地图/数组)的RDD?例如,当我写这个测试代码时:

case class Test(name: String, map: Map[String, String])
val map = Map("hello" -> "world", "hey" -> "there")
val map2 = Map("hello" -> "people", "hey" -> "you")
val rdd = sc.parallelize(Array(Test("first", map), Test("second", map2)))
Run Code Online (Sandbox Code Playgroud)

我虽然语法如下:

sqlContext.sql("SELECT * FROM rdd WHERE map.hello = world")
Run Code Online (Sandbox Code Playgroud)

要么

sqlContext.sql("SELECT * FROM rdd WHERE map[hello] = world")
Run Code Online (Sandbox Code Playgroud)

但我明白了

无法访问MapType类型中的嵌套字段(StringType,StringType,true)

org.apache.spark.sql.catalyst.errors.package $ TreeNodeException:未解析的属性

分别.

sql scala dataframe apache-spark apache-spark-sql

54
推荐指数
1
解决办法
5万
查看次数

将新的键/值对添加到 Spark MapType 列

我有一个带有 MapType 字段的数据框。

>>> from pyspark.sql.functions import *
>>> from pyspark.sql.types import *
>>> fields = StructType([
...         StructField('timestamp',      TimestampType(), True),
...         StructField('other_field',    StringType(), True),
...         StructField('payload',        MapType(
...                                         keyType=StringType(),
...                                         valueType=StringType()),
...                                                     True),   ])
>>> import datetime
>>> rdd = sc.parallelize([[datetime.datetime.now(), 'this should be in', {'akey': 'aValue'}]])
>>> df = rdd.toDF(fields)
>>> df.show()
+--------------------+-----------------+-------------------+
|           timestamp|      other_field|            payload|
+--------------------+-----------------+-------------------+
|2018-01-10 12:56:...|this should be in|Map(akey -> aValue)|
+--------------------+-----------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

我想添加other_field作为字段中的键payload

我知道我可以使用 udf:

>>> def _add_to_map(name, value, map_field): …
Run Code Online (Sandbox Code Playgroud)

python apache-spark-sql pyspark

7
推荐指数
2
解决办法
9854
查看次数

将 Pyspark 数据框中的字典拆分为单独的列

我有一个数据框(在 Pyspark 中),其中一个行值作为字典:

df.show()
Run Code Online (Sandbox Code Playgroud)

它看起来像:

+----+---+-----------------------------+
|name|age|info                         |
+----+---+-----------------------------+
|rob |26 |{color: red, car: volkswagen}|
|evan|25 |{color: blue, car: mazda}    |
+----+---+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

根据评论给出更多:

df.printSchema()
Run Code Online (Sandbox Code Playgroud)

类型是字符串

root
 |-- name: string (nullable = true)
 |-- age: string (nullable = true)
 |-- dict: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

是否可以从字典(颜色和汽车)中获取键并将它们设置为数据框中的列,并将值作为这些列的行?

预期结果:

+----+---+-----------------------------+
|name|age|color |car                   |
+----+---+-----------------------------+
|rob |26 |red   |volkswagen            |
|evan|25 |blue  |mazda                 |
+----+---+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

我不知道我必须使用 df.withColumn() 并以某种方式遍历字典来选择每个字典,然后从中创建一列?到目前为止,我已经尝试找到一些答案,但大多数都使用 Pandas,而不是 Spark,所以我不确定是否可以应用相同的逻辑。

python dictionary dataframe apache-spark pyspark

6
推荐指数
1
解决办法
1万
查看次数

将具有结构数组的列扩展为新列

我有一个带有单列的 DataFrame,它是一个结构数组

df.printSchema()
root
 |-- dataCells: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- label: string (nullable = true)
 |    |    |-- value: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

一些示例数据可能如下所示:

df.first()
Row(dataCells=[Row(label="firstName", value="John"), Row(label="lastName", value="Doe"), Row(label="Date", value="1/29/2018")])
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚如何通过将每个结构转换为命名列来重新格式化此 DataFrame。我想要一个像这样的数据框:

------------------------------------
| firstName | lastName | Date      |
------------------------------------
| John      | Doe      | 1/29/2018 |
| ....      | ...      | ...       |
Run Code Online (Sandbox Code Playgroud)

我已经尝试了我能想到的一切,但还没有弄清楚。

apache-spark pyspark

4
推荐指数
1
解决办法
5166
查看次数