aboutsummaryrefslogtreecommitdiff
path: root/python/pyspark/sql.py
diff options
context:
space:
mode:
authorDavies Liu <davies.liu@gmail.com>2014-09-27 12:21:37 -0700
committerMichael Armbrust <michael@databricks.com>2014-09-27 12:21:37 -0700
commit0d8cdf0ede908f6c488a075170f1563815009e29 (patch)
treea166fcfd95d7f66f0b9c54e5f9b0866eb95959ee /python/pyspark/sql.py
parentf0c7e19550d46f81a0a3ff272bbf66ce4bafead6 (diff)
downloadspark-0d8cdf0ede908f6c488a075170f1563815009e29.tar.gz
spark-0d8cdf0ede908f6c488a075170f1563815009e29.tar.bz2
spark-0d8cdf0ede908f6c488a075170f1563815009e29.zip
[SPARK-3681] [SQL] [PySpark] fix serialization of List and Map in SchemaRDD
Currently, the schema of object in ArrayType or MapType is attached lazily, it will have better performance but introduce issues while serialization or accessing nested objects. This patch will apply schema to the objects of ArrayType or MapType immediately when accessing them, will be a little bit slower, but much robust. Author: Davies Liu <davies.liu@gmail.com> Closes #2526 from davies/nested and squashes the following commits: 2399ae5 [Davies Liu] fix serialization of List and Map in SchemaRDD
Diffstat (limited to 'python/pyspark/sql.py')
-rw-r--r--python/pyspark/sql.py40
1 files changed, 13 insertions, 27 deletions
diff --git a/python/pyspark/sql.py b/python/pyspark/sql.py
index 653195ea43..f71d24c470 100644
--- a/python/pyspark/sql.py
+++ b/python/pyspark/sql.py
@@ -838,43 +838,29 @@ def _create_cls(dataType):
>>> obj = _create_cls(schema)(row)
>>> pickle.loads(pickle.dumps(obj))
Row(a=[1], b={'key': Row(c=1, d=2.0)})
+ >>> pickle.loads(pickle.dumps(obj.a))
+ [1]
+ >>> pickle.loads(pickle.dumps(obj.b))
+ {'key': Row(c=1, d=2.0)}
"""
if isinstance(dataType, ArrayType):
cls = _create_cls(dataType.elementType)
- class List(list):
-
- def __getitem__(self, i):
- # create object with datetype
- return _create_object(cls, list.__getitem__(self, i))
-
- def __repr__(self):
- # call collect __repr__ for nested objects
- return "[%s]" % (", ".join(repr(self[i])
- for i in range(len(self))))
-
- def __reduce__(self):
- return list.__reduce__(self)
+ def List(l):
+ if l is None:
+ return
+ return [_create_object(cls, v) for v in l]
return List
elif isinstance(dataType, MapType):
- vcls = _create_cls(dataType.valueType)
-
- class Dict(dict):
-
- def __getitem__(self, k):
- # create object with datetype
- return _create_object(vcls, dict.__getitem__(self, k))
-
- def __repr__(self):
- # call collect __repr__ for nested objects
- return "{%s}" % (", ".join("%r: %r" % (k, self[k])
- for k in self))
+ cls = _create_cls(dataType.valueType)
- def __reduce__(self):
- return dict.__reduce__(self)
+ def Dict(d):
+ if d is None:
+ return
+ return dict((k, _create_object(cls, v)) for k, v in d.items())
return Dict