首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我如何才能在PySpark中得到一个不同的数据集?

我如何才能在PySpark中得到一个不同的数据集?
EN

Stack Overflow用户
提问于 2016-02-19 16:19:44
回答 2查看 1.5K关注 0票数 2

我有一个字典的RDD,我想得到一个只包含不同元素的RDD。但是,当我试图打电话给

代码语言:javascript
代码运行次数:0
运行
复制
rdd.distinct()

PySpark给出了以下错误

代码语言:javascript
代码运行次数:0
运行
复制
TypeError: unhashable type: 'dict'

    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:166)
    at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:207)
    at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:306)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:270)
    at org.apache.spark.api.python.PairwiseRDD.compute(PythonRDD.scala:342)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:306)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:270)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
    at org.apache.spark.scheduler.Task.run(Task.scala:89)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
16/02/19 16:55:56 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, localhost): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/usr/local/Cellar/apache-spark/1.6.0/libexec/python/lib/pyspark.zip/pyspark/worker.py", line 111, in main
    process()
  File "/usr/local/Cellar/apache-spark/1.6.0/libexec/python/lib/pyspark.zip/pyspark/worker.py", line 106, in process
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/usr/local/Cellar/apache-spark/1.6.0/libexec/python/lib/pyspark.zip/pyspark/rdd.py", line 2346, in pipeline_func
  File "/usr/local/Cellar/apache-spark/1.6.0/libexec/python/lib/pyspark.zip/pyspark/rdd.py", line 2346, in pipeline_func
  File "/usr/local/Cellar/apache-spark/1.6.0/libexec/python/lib/pyspark.zip/pyspark/rdd.py", line 317, in func
  File "/usr/local/Cellar/apache-spark/1.6.0/libexec/python/lib/pyspark.zip/pyspark/rdd.py", line 1776, in combineLocally
  File "/usr/local/Cellar/apache-spark/1.6.0/libexec/python/lib/pyspark.zip/pyspark/shuffle.py", line 238, in mergeValues
    d[k] = comb(d[k], v) if k in d else creator(v)
TypeError: unhashable type: 'dict'

我确实在dict中有一个键,我可以使用它作为不同的元素,但是文档没有给出任何关于如何解决这个问题的线索。

编辑:内容由字符串、字符串数组和数字字典组成。

编辑2:字典示例.我希望具有相等"data_fingerprint“键的分词被认为是平等的:

代码语言:javascript
代码运行次数:0
运行
复制
{"id":"4eece341","data_fingerprint":"1707db7bddf011ad884d132bf80baf3c"}

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 17:03:24

正如@zero323在他的评论中指出的那样,你必须决定如何比较字典,因为它们是不可理解的。一种方法是对键进行排序(因为它们不是以任何特定的顺序排列),例如,按照词汇编码顺序排序。然后创建表单的字符串:

代码语言:javascript
代码运行次数:0
运行
复制
def dict_to_string(dict):
    ...
    return 'key1|value1|key2|value2...|keyn|valuen'

如果您有嵌套的不可访问对象,则必须递归地执行此操作。

现在,您只需将您的RDD转换为与字符串作为键(或它的某种散列)对。

代码语言:javascript
代码运行次数:0
运行
复制
pairs = dictRDD.map(lambda d: (dict_to_string(d), d))

为了得到你想要的,你只需要像法洛斯那样按键减少

代码语言:javascript
代码运行次数:0
运行
复制
distinctDicts = pairs.reduceByKey(lambda val1, val2: val1).values()
票数 2
EN

Stack Overflow用户

发布于 2016-02-19 22:15:38

由于您的数据提供了一个唯一的键,所以您可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
(rdd
    .keyBy(lambda d: d.get("data_fingerprint"))
    .reduceByKey(lambda x, y: x)
    .values())

Python字典至少有两个问题,这使它们成为了哈希的坏候选者:

  • 易变-这使得任何哈希操作都很棘手。
  • 任意阶键

不久前,有一个PEP提出了frozerdicts (佩普0416),但最终被拒绝了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35509919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档