{ "info": { "author": "Andriy Kushnir (Orhideous)", "author_email": "me@orhideous.name", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "tinsel\n======\n\n*Your data IS your schema*\n\n.. image:: https://img.shields.io/pypi/pyversions/tinsel.svg\n :target: https://pypi.python.org/pypi/tinsel\n.. image:: https://img.shields.io/pypi/v/tinsel.svg\n :target: https://pypi.python.org/pypi/tinsel\n.. image:: https://coveralls.io/repos/github/Orhideous/tinsel/badge.svg?branch=master\n :target: https://coveralls.io/github/Orhideous/tinsel?branch=master\n.. image:: https://img.shields.io/travis/Orhideous/tinsel.svg\n :target: https://travis-ci.org/Orhideous/tinsel\n.. image:: https://pyup.io/repos/github/Orhideous/tinsel/shield.svg\n :target: https://pyup.io/repos/github/Orhideous/tinsel/\n\nThis tiny library helps to overcome excessive complexity in hand-written pyspark\ndataframe schemas.\n\nHow?\n----\n\nShape your data as ``NamedTuple`` or dataclasses - they can freely mix::\n\n from dataclasses import dataclass\n from tinsel import struct, transform\n from typing import NamedTuple, Optional, Dict, List\n\n @struct\n @dataclass\n class UserInfo:\n hobby: List[str]\n last_seen: Optional[int]\n pet_ages: Dict[str, int]\n\n\n @struct\n class User(NamedTuple):\n login: str\n age: int\n active: bool\n info: Optional[UserInfo]\n\n\nTransform root node (``User`` in our case) into schema::\n\n schema = transform(User)\n\n\nCreate some data, if necessary::\n\n data = [\n User(\n login=\"Ben\",\n age=18,\n active=False,\n info=None\n ),\n User(\n login=\"Tom\",\n age=32,\n active=True,\n info=UserInfo(\n hobby=[\"pets\", \"flowers\"],\n last_seen=16,\n pet_ages={\"Jack\": 2, \"Sunshine\": 6}\n )\n )\n ]\n\nAnd\u2026 voil\u00e0!::\n\n from pyspark.sql import SparkSession\n\n sc = SparkSession.builder.master('local').getOrCreate()\n\n df = sc.createDataFrame(data=data, schema=schema)\n df.printSchema()\n df.show(truncate=False)\n\nThis will output::\n\n root\n |-- login: string (nullable = false)\n |-- age: integer (nullable = false)\n |-- active: boolean (nullable = false)\n |-- info: struct (nullable = true)\n | |-- hobby: array (nullable = false)\n | | |-- element: string (containsNull = false)\n | |-- last_seen: integer (nullable = true)\n | |-- pet_ages: map (nullable = false)\n | | |-- key: string\n | | |-- value: integer (valueContainsNull = false)\n\n\n +-----+---+------+----------------------------------------------+\n |login|age|active|info |\n +-----+---+------+----------------------------------------------+\n |Ben |18 |false |null |\n |Tom |32 |true |[[pets, flowers],, [Jack -> 2, Sunshine -> 6]]|\n +-----+---+------+----------------------------------------------+\n\nFeatures\n--------\n* use native python types; no extra DSL, no cryptic API \u2014 just plain Python;\n* small and fast;\n* provide type shims for some types absent in Python, like ``long`` or ``short``;\n* nullable fields naturally fits into schema definition;\n\nCredits\n-------\n\nThis package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\n=======\nHistory\n=======\n\n0.2.0 (2018-08-28)\n------------------\n\n* Added dataclasses support\n\n0.1.0 (2018-08-28)\n------------------\n\n* First release on PyPI.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Orhideous/tinsel", "keywords": "tinsel,pyspark,spark,schema,struct", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "tinsel", "package_url": "https://pypi.org/project/tinsel/", "platform": "", "project_url": "https://pypi.org/project/tinsel/", "project_urls": { "Homepage": "https://github.com/Orhideous/tinsel" }, "release_url": "https://pypi.org/project/tinsel/0.3.0/", "requires_dist": [ "pyspark (>=2.3)" ], "requires_python": "", "summary": "PySpark schema generator", "version": "0.3.0" }, "last_serial": 4229453, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "9d727390c54fe2d6a5db103d4d078462", "sha256": "4af71086db358b9fa94233dba85834e699251fb5f153fae6517a3adb97b2d9c9" }, "downloads": -1, "filename": "tinsel-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9d727390c54fe2d6a5db103d4d078462", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4529, "upload_time": "2018-08-28T13:35:28", "url": "https://files.pythonhosted.org/packages/79/95/2e758c38faca72bbb37ef453cc6be4848719a4cb711c99b9dda7fd0baabe/tinsel-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "de01646641ccb09421907930c46c1195", "sha256": "e3e7ddda03455aaf7f0f39102f8cd1606f458a427e1dd49d3cc7f9be4f2e4c17" }, "downloads": -1, "filename": "tinsel-0.1.0.tar.gz", "has_sig": false, "md5_digest": "de01646641ccb09421907930c46c1195", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8459, "upload_time": "2018-08-28T13:35:30", "url": "https://files.pythonhosted.org/packages/2a/ac/ef3571ab9ae3d4175539f2339cd8391637120f4aacfd59160214ab4f9c86/tinsel-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "ead5962bef80c195d34362fa7418fff4", "sha256": "f122a55a38fea0e805e9d4c02f09a7b833f987661a3e45500bf3614fa30e5758" }, "downloads": -1, "filename": "tinsel-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ead5962bef80c195d34362fa7418fff4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4579, "upload_time": "2018-08-28T14:31:52", "url": "https://files.pythonhosted.org/packages/c4/51/f7483b867b0c7507fa6ac1109471b4fde2ebdc645e93d629ffec4af710e7/tinsel-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e8ec2c5915d73ab89f8e100430d9b0a4", "sha256": "351694cea0439992231ee1d6ba7f1f4898930eb851d5d7a813b1da6b15fe67a9" }, "downloads": -1, "filename": "tinsel-0.2.0.tar.gz", "has_sig": false, "md5_digest": "e8ec2c5915d73ab89f8e100430d9b0a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9290, "upload_time": "2018-08-28T14:31:53", "url": "https://files.pythonhosted.org/packages/e4/08/7980b31005969b0364bb00ca7feb1e7e45bcc1b0f78052c472921a674bd4/tinsel-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "1e96843baf15dd94aa5a15ba5e1c2429", "sha256": "5780403a4c4e5ff9e80e2fafae36593da4e05dde918b6e91168f88ba41e3f7b1" }, "downloads": -1, "filename": "tinsel-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1e96843baf15dd94aa5a15ba5e1c2429", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4842, "upload_time": "2018-09-01T16:09:16", "url": "https://files.pythonhosted.org/packages/ae/4b/e847eb317ef1f86d66723a7862051bb351c6f4bb0c5d9da2de103bdb9d71/tinsel-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b71b227bbec9251b3a66f4cd908dbffd", "sha256": "bc58b3965c06ab4b51fabc5d1cb710718bf4a0bb9b2626116175e5290fede617" }, "downloads": -1, "filename": "tinsel-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b71b227bbec9251b3a66f4cd908dbffd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9078, "upload_time": "2018-09-01T16:09:17", "url": "https://files.pythonhosted.org/packages/73/0b/d5a75c4674c8c0a306249ba81a9b2a1cf3dfc51b2479bfe0dbb5c7b510d0/tinsel-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1e96843baf15dd94aa5a15ba5e1c2429", "sha256": "5780403a4c4e5ff9e80e2fafae36593da4e05dde918b6e91168f88ba41e3f7b1" }, "downloads": -1, "filename": "tinsel-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1e96843baf15dd94aa5a15ba5e1c2429", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4842, "upload_time": "2018-09-01T16:09:16", "url": "https://files.pythonhosted.org/packages/ae/4b/e847eb317ef1f86d66723a7862051bb351c6f4bb0c5d9da2de103bdb9d71/tinsel-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b71b227bbec9251b3a66f4cd908dbffd", "sha256": "bc58b3965c06ab4b51fabc5d1cb710718bf4a0bb9b2626116175e5290fede617" }, "downloads": -1, "filename": "tinsel-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b71b227bbec9251b3a66f4cd908dbffd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9078, "upload_time": "2018-09-01T16:09:17", "url": "https://files.pythonhosted.org/packages/73/0b/d5a75c4674c8c0a306249ba81a9b2a1cf3dfc51b2479bfe0dbb5c7b510d0/tinsel-0.3.0.tar.gz" } ] }