Spark schema αž€αžΆαžšαžœαž·αžœαžαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž

αž’αŸ’αž“αž€αž’αžΆαž“αž‡αžΆαž‘αžΈαž‚αŸ„αžšαž– αžαŸ’αž„αŸƒαž›αŸ’αž’!

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž‘αžΈαž”αŸ’αžšαžΉαž€αŸ’αžŸαžΆαžˆαžΆαž“αž˜αž»αžαž‚αŸαž“αŸƒαžαŸ†αž”αž“αŸ‹αž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜ Big Data Solutions αžšαž”αžŸαŸ‹ Neoflex αž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž‡αž˜αŸ’αžšαžΎαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αžŸαžΆαž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αžαŸαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Apache Spark αŸ”

αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αžœαž·αž—αžΆαž‚αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„αž˜αž»αžαž αžΆαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž›αž»αž„αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž€αžΎαžαž‘αžΎαž„αŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αž¬αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ— αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‡αžΆ JSON ឬ XMLαŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž‘αž»αž€β€‹αž‘αžΎαž„β€‹αž‘αŸ… Hadoop αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€β€‹αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž˜αž»αžβ€‹αž αžΆαž„β€‹αž–αžΈβ€‹αž–αž½αž€β€‹αž‚αŸβ€‹αŸ” αž™αžΎαž„αž’αžΆαž…αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž“αŸ’αž›αŸ‚αž„αžαžΆαŸ†αž„αž”αž„αŸ’αž αžΆαž‰αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž§αž‘αžΆαž αžšαžŽαŸαžαžΆαž˜αžšαž™αŸˆ Impala αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸƒαž˜αž»αžαž αžΆαž„αž‚αŸ„αž›αžŠαŸ…αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŠαžΉαž„αž‡αžΆαž˜αž»αž“αž‘αŸαŸ” αž‡αžΆαž„αž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αž€αŸαž˜αž·αž“αž’αžΆαž…αž‚αžΌαžšαž‘αž»αž€αž‡αžΆαž˜αž»αž“αž”αžΆαž“αžŠαŸ‚αžš αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™ αž αžΎαž™αž™αžΎαž„αž€αŸ†αž–αž»αž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž›αž»αž„αžαŸ’αž›αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ”

αž§αž‘αžΆαž αžšαžŽαŸ αžαŸ’αž„αŸƒαž“αŸαŸ‡ αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαŸ–

{source: "app1", error_code: ""}

αž αžΎαž™αžαŸ’αž„αŸƒαžŸαŸ’αž’αŸ‚αž€ αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ‚αž˜αž½αž™αž˜αž€ αž…αž˜αŸ’αž›αžΎαž™αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

{source: "app1", error_code: "error", description: "Network error"}

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αžœαžΆαž›αž˜αž½αž™αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž”αž„αŸ’αž αžΆαž‰ - αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆ αž αžΎαž™αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αžŠαžΉαž„αžαžΆαžœαžΆαž“αžΉαž„αž˜αž€αž¬αž’αžαŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ”

αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž storefront αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ‚αž”αž“αŸαŸ‡αž‚αžΊαž–αž·αžαž‡αžΆαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž αžΎαž™ Spark αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž˜αžΆαž“αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„ JSON αž“αž·αž„ XML αž αžΎαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αž˜αž·αž“αžŸαŸ’αž‚αžΆαž›αŸ‹αž–αžΈαž˜αž»αž“ αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ schemaEvolution αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αŸ”

αž“αŸ… glance αžŠαŸ†αž”αžΌαž„, αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž˜αžΎαž›αž‘αŸ…αžŸαžΆαž˜αž‰αŸ’αž‰αŸ” αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž™αž€ Folder αž‡αžΆαž˜αž½αž™ JSON αž αžΎαž™αž’αžΆαž“αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„ dataframeαŸ” Spark αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸ αž”αž„αŸ’αžœαŸ‚αžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αžšαžΌαžœαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„ parquet αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžΆαŸ†αž‘αŸ’αžšαž•αž„αžŠαŸ‚αžšαž“αŸ…αž€αŸ’αž“αž»αž„ Impala αžŠαŸ„αž™αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž˜αž»αžαž αžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Hive metastore αŸ”

αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžŸαžΆαž˜αž‰αŸ’αž‰αŸ”

αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž˜αž·αž“αž…αŸ’αž”αžΆαžŸαŸ‹αž‘αŸαž–αžΈαž§αž‘αžΆαž αžšαžŽαŸαžαŸ’αž›αžΈαŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‡αžΆαž˜αž½αž™αž”αž‰αŸ’αž αžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαŸ”

αž―αž€αžŸαžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž˜αž·αž“αž”αž„αŸ’αž€αžΎαž storefront αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“ JSON ឬ XML αž‘αŸ…αž€αŸ’αž“αž»αž„ dataframe αŸ”

αž–αŸ„αž›αž‚αžΊαžœαžΆαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž’αžΆαž“ αž“αž·αž„αž‰αŸ‚αž€ JSONαŸ–

df = spark.read.json(path...)

αž“αŸαŸ‡αž‚αžΊαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Spark αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž‡αžΆαž„αž€αžΆαžšαž’αžΆαž“αž―αž€αžŸαžΆαžš JSON αž–αžΈαžαžαž―αž€αžŸαžΆαžš αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαžŸαŸŠαž»αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ– αž˜αžΆαž“αž˜αž»αžαž αžΆαž„αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžšαž½αž…αž αžΎαž™ αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž˜αžΈαž…αžΌαž›αž˜αž€αž‡αžΆαžšαŸ€αž„αžšαžΆαž›αŸ‹αžαŸ’αž„αŸƒ αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž˜αž»αžαž αžΆαž„αžŠαŸ„αž™αž˜αž·αž“αž—αŸ’αž›αŸαž…αžαžΆαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž’αžΆαž…αžαž»αžŸαž‚αŸ’αž“αžΆαŸ”

αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž’αž˜αŸ’αž˜αžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž€αž“αŸ’αž›αŸ‚αž„αžαžΆαŸ†αž„αž”αž„αŸ’αž αžΆαž‰αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:

αž‡αŸ†αž αžΆαž“ 1 αŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž‘αž»αž€β€‹αž‘αŸ…β€‹αž€αŸ’αž“αž»αž„ Hadoop αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž€αžΆαžšβ€‹αž•αŸ’αž‘αž»αž€β€‹αž‘αžΎαž„β€‹αžœαž·αž‰β€‹αž”αŸ’αžšαž…αžΆαŸ†β€‹αžαŸ’αž„αŸƒβ€‹αž‡αžΆβ€‹αž”αž“αŸ’αžβ€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž“αž·αž„β€‹αž”αžΆαž“β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž‘αŸ…β€‹αž—αžΆαž‚β€‹αžαžΆβ€‹αžŸβ€‹αžαŸ’αž˜αžΈβ€‹αž˜αž½αž™β€‹αŸ” αžœαžΆαž”αŸ’αžšαŸ‚αž…αŸαž‰αžαžαžŠαŸ‚αž›αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ†αž”αžΌαž„αž”αŸ‚αž„αž…αŸ‚αž€αžαžΆαž˜αžαŸ’αž„αŸƒαŸ”

αž‡αŸ†αž αžΆαž“ 2 αŸ” αž€αŸ†αž‘αž»αž„αž–αŸαž›αž•αŸ’αž‘αž»αž€αžŠαŸ†αž”αžΌαž„ αžαžαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“ αž“αž·αž„αž‰αŸ‚αž€αžŠαŸ„αž™ Spark αŸ” αžŸαŸŠαž»αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž›αž‘αŸ’αž’αž•αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αž’αžΆαž…αž‰αŸ‚αž€αž”αžΆαž“ αž§αž‘αžΆαž αžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„ parquet αžŠαŸ‚αž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž“αžΆαŸ†αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ Impala αŸ” αžœαžΆαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž‚αŸ„αž›αžŠαŸ…αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αžšαž αžΌαžαžŠαž›αŸ‹αž…αŸ†αžŽαž»αž…αž“αŸαŸ‡αŸ”

αž‡αŸ†αž αžΆαž“ 3 αŸ” αž€αžΆαžšαž‘αžΆαž‰αž™αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ‚αž›αž“αžΉαž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž˜αž»αžαž αžΆαž„αž‡αžΆαžšαŸ€αž„αžšαžΆαž›αŸ‹αžαŸ’αž„αŸƒαŸ”
αž˜αžΆαž“αžŸαŸ†αžŽαž½αžšαž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž€αžΆαžšαž•αŸ’αž‘αž»αž€ αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž€αž“αŸ’αž›αŸ‚αž„αžαžΆαŸ†αž„αž”αž„αŸ’αž αžΆαž‰ αž“αž·αž„αžŸαŸ†αžŽαž½αžšαž“αŸƒαž€αžΆαžšαžαŸ‚αžšαž€αŸ’αžŸαžΆαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž‘αžΌαž‘αŸ…αž“αŸƒαž€αž“αŸ’αž›αŸ‚αž„αžαžΆαŸ†αž„αž”αž„αŸ’αž αžΆαž‰αŸ”

αžŸαžΌαž˜αž›αžΎαž€αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αŸ” αž…αžΌαžšαž“αž·αž™αžΆαž™αžαžΆαž‡αŸ†αž αžΆαž“αžŠαŸ†αž”αžΌαž„αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžƒαŸ’αž›αžΆαŸ†αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž αžΎαž™αž―αž€αžŸαžΆαžš JSON αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αž‘αžΎαž„αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž―αž€αžŸαžΆαžšαŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž dataframe αž–αžΈαž–αž½αž€αžœαžΆ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰ αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž”αž‰αŸ’αž αžΆαž‘αŸαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‡αŸ†αž αžΆαž“αžŠαŸ†αž”αžΌαž„αž”αŸ†αž•αž»αžαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš SparkαŸ–

df = spark.read.option("mergeSchema", True).json(".../*") 
df.printSchema()

root 
|-- a: long (nullable = true) 
|-- b: string (nullable = true) 
|-- c: struct (nullable = true) |    
|-- d: long (nullable = true)

αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž›αŸ’αž’αŸ”

αž™αžΎαž„αž’αžΆαž“ αž“αž·αž„αž‰αŸ‚αž€ JSON αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ dataframe αž‡αžΆ parquet αžŠαŸ„αž™αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ Hive αžαžΆαž˜αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŽαžΆαž˜αž½αž™αŸ–

df.write.format(β€œparquet”).option('path','<External Table Path>').saveAsTable('<Table Name>')

αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž”αž„αŸ’αž’αž½αž…αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαŸ’αž„αŸƒαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž˜αžΈαž–αžΈαž”αŸ’αžšαž—αž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αŸ” αž™αžΎαž„β€‹αž˜αžΆαž“β€‹αžαžβ€‹αž―αž€αžŸαžΆαžšβ€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“ JSON αž“αž·αž„β€‹αž•αŸ’αž‘αžΆαŸ†αž„β€‹αž”αž„αŸ’αž αžΆαž‰β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž–αžΈβ€‹αžαžβ€‹αž“αŸαŸ‡αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αžŽαŸ’αžαž»αŸ†αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αŸ’αžšαž—αž– Data mart αž”αžΆαžαŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαž˜αŸ’αž›αŸƒαž˜αž½αž™αžαŸ’αž„αŸƒαŸ”

αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αžΌαž‡αžΈαžαž›αž‚αžΊαžαŸ’αžšαžΌαžœαž”αŸ‚αž„αž…αŸ‚αž€αž˜αž»αžαž αžΆαž„αžαžΆαž˜αž˜αž½αž™αžαŸ’αž„αŸƒ αžŠαŸ‚αž›αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž‚αžαžΆαžŸαžαŸ’αž˜αžΈαžšαŸ€αž„αžšαžΆαž›αŸ‹αžαŸ’αž„αŸƒαž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αž™αž“αŸ’αžαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αž•αž„αžŠαŸ‚αžš Spark αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž—αžΆαž‚αžαžΆαžŸαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αŸ”

αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž‘αž»αž€αžŠαŸ†αž”αžΌαž„αžŠαŸ„αž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αžαŸ‚αž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ storefront αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžαŸ‚αž˜αŸ’αžαž„αž‚αžαŸ‹αŸ–

df.write.partitionBy("date_load").mode("overwrite").parquet(dbpath + "/" + db + "/" + destTable)

αž“αŸ…αžαŸ’αž„αŸƒαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž•αŸ’αž‘αž»αž€αžαŸ‚αž—αžΆαž‚αžαžΆαžŸαžαŸ’αž˜αžΈαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ–

df.coalesce(1).write.mode("overwrite").parquet(dbpath + "/" + db + "/" + destTable +"/date_load=" + date_load + "/")

αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž€αŸ’αž“αž»αž„ Hive αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαŸ”
αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž”αž‰αŸ’αž αžΆαž€αžΎαžαž‘αžΎαž„αŸ”

αž”αž‰αŸ’αž αžΆαžŠαŸ†αž”αžΌαž„αŸ” αž˜αž·αž“αž™αžΌαžšαž˜αž·αž“αž†αžΆαž”αŸ‹ parquet αž›αž‘αŸ’αž’αž•αž›αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αž‘αŸαŸ” αž“αŸαŸ‡αž‚αžΊαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžšαž”αŸ€αž”αžŠαŸ‚αž› parquet αž“αž·αž„ JSON αž–αŸ’αž™αžΆαž”αžΆαž›αžœαžΆαž›αž‘αž‘αŸαžαž»αžŸαž‚αŸ’αž“αžΆαŸ”

αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž’αŸ†αž–αžΈαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž˜αŸ’αžŸαž·αž›αž˜αž·αž‰ JSON αž˜αž€αžŠαž›αŸ‹αŸ–

Π”Π΅Π½ΡŒ 1: {"a": {"b": 1}},

αž αžΎαž™αžαŸ’αž„αŸƒαž“αŸαŸ‡ JSON αžŠαžΌαž…αž‚αŸ’αž“αžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

Π”Π΅Π½ΡŒ 2: {"a": null}

αž§αž”αž˜αžΆαžαžΆαž™αžΎαž„αž˜αžΆαž“αž—αžΆαž‚αžαžΆαžŸαž–αžΈαžšαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžŠαŸ‚αž›αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αž”αž“αŸ’αž‘αžΆαžαŸ‹αž˜αž½αž™αŸ”
αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž’αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž–αž‘αžΆαŸ†αž„αž˜αžΌαž› Spark αž“αžΉαž„αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž”αŸ’αžšαž—αŸαž‘ αž αžΎαž™αž“αžΉαž„αž™αž›αŸ‹αžαžΆ "a" αž‚αžΊαž‡αžΆαžœαžΆαž›αž“αŸƒαž”αŸ’αžšαž—αŸαž‘ "structure" αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαžΆαž›αžŠαŸ‚αž›αžŠαžΆαž€αŸ‹ "b" αž“αŸƒαž”αŸ’αžšαž—αŸαž‘ INT αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž—αžΆαž‚αžαžΆαžŸαž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαž“αŸ„αŸ‡αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“ parquet αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž—αžΆαž‚αž˜αž·αž“αž†αž”αž‚αŸ’αž“αžΆ:

df1 (a: <struct<"b": INT>>)
df2 (a: STRING NULLABLE)

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‡αžΆαž–αž·αžŸαŸαžŸ - αž“αŸ…αž–αŸαž›αž‰αŸ‚αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž– αž™αž€αžœαžΆαž›αž‘αž‘αŸαž…αŸαž‰αŸ–

df = spark.read.json("...", dropFieldIfAllNull=True)

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ parquet αž“αžΉαž„αž˜αžΆαž“αž—αžΆαž‚αžαžΆαžŸαžŠαŸ‚αž›αž’αžΆαž…αž’αžΆαž“αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž”αžΆαž“αŸ”
αžαŸ’αžœαžΈαžαŸ’αž”αž·αžαžαŸ‚αž’αŸ’αž“αž€αžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αžΉαž„αž‰αž‰αžΉαž˜αž™αŸ‰αžΆαž„αž‡αžΌαžšαž…αžαŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž€αŸαžŠαŸ„αž™αŸ” αž αŸαžαž»αž’αŸ’αžœαžΈ? αž”αžΆαž‘ / αž…αžΆαžŸαž–αŸ’αžšαŸ„αŸ‡αž‘αŸ†αž“αž„αž‡αžΆαž˜αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž–αžΈαžšαž‘αŸ€αžαŸ” αž¬αž”αžΈαŸ” αž¬αž”αž½αž“αŸ” αž‘αžΈαž˜αž½αž™ αžŠαŸ‚αž›αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž“αžΉαž„αž€αžΎαžαž‘αžΎαž„ αž‚αžΊαžαžΆαž”αŸ’αžšαž—αŸαž‘αž›αŸαžαž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžαž»αžŸαž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš JSON αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ” αž§αž‘αžΆαž αžšαžŽαŸ {intField: 1} αž“αž·αž„ {intField: 1.1} αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž›αž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž—αžΆαž‚αžαžΆαžŸαž˜αž½αž™ αž“αŸ„αŸ‡αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αžΉαž„αž’αžΆαž“αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžŠαŸ‚αž›αž“αžΆαŸ†αž‘αŸ…αžŠαž›αŸ‹αž”αŸ’αžšαž—αŸαž‘αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž”αŸ†αž•αž»αžαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αž“αŸ„αŸ‡αž˜αž½αž™αž“αžΉαž„αž˜αžΆαž“ intField: int αž αžΎαž™αž˜αž½αž™αž‘αŸ€αžαž“αžΉαž„αž˜αžΆαž“ intField: αž‘αŸ’αžœαŸαŸ”

αž˜αžΆαž“αž‘αž„αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡αŸ–

df = spark.read.json("...", dropFieldIfAllNull=True, primitivesAsString=True)

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αžαžαžŠαŸ‚αž›αž˜αžΆαž“αž—αžΆαž‚αžαžΆαžŸαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ dataframe αžαŸ‚αž˜αž½αž™αž“αž·αž„ parquet αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒ showcase αž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ” αž”αžΆαž‘? αž‘αŸ

αž™αžΎαž„αžαŸ’αžšαžΌαžœαžαŸ‚αž…αž„αž…αžΆαŸ†αžαžΆαž™αžΎαž„αž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžšαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Hive αŸ” Hive αž˜αž·αž“αž”αŸ’αžšαž€αžΆαž“αŸ‹αž’αž€αŸ’αžŸαžšαžαžΌαž…αž’αŸ†αž“αŸ…αž€αŸ’αž“αž»αž„αžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαž›αž‘αŸ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž› parquet αž‚αžΊαž”αŸ’αžšαž€αžΆαž“αŸ‹αž’αž€αŸ’αžŸαžšαžαžΌαž…αž’αŸ†αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž—αžΆαž‚αžαžΆαžŸαžŠαŸ‚αž›αž˜αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαŸ– field1: int αž“αž·αž„ Field1: int αž‚αžΊαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Hive αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž˜αŸ‚αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Spark αž‘αŸαŸ” αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž”αŸ†αž”αŸ’αž›αŸ‚αž„αžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαž›αž‘αŸ…αž‡αžΆαž’αž€αŸ’αžŸαžšαžαžΌαž…αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž’αŸ’αžœαžΈαŸ—αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž›αŸ’αž’αŸ”

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αž˜αž·αž“αž˜αŸ‚αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαžΆαž˜αž‰αŸ’αž‰αž‘αŸαŸ” αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž‘αžΈαž–αžΈαžš αžŠαŸ‚αž›αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αž•αž„αžŠαŸ‚αžšαŸ” αžŠαŸ„αž™αžŸαžΆαžšαž—αžΆαž‚αžαžΆαžŸαžαŸ’αž˜αžΈαž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆ αžαžαž—αžΆαž‚αžαžΆαžŸαž“αžΉαž„αž˜αžΆαž“αž―αž€αžŸαžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ Spark αž§αž‘αžΆαž αžšαžŽαŸ αž‘αž„αŸ‹αž‡αŸ„αž‚αž‡αŸαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš _SUCCESS αŸ” αž“αŸαŸ‡αž“αžΉαž„αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž“αŸ…αž–αŸαž›αž–αŸ’αž™αžΆαž™αžΆαž˜ parquet αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‡αŸ€αžŸαžœαžΆαž„αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžšαž–αžΆαžš Spark αž–αžΈαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž―αž€αžŸαžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αŸ…αžαžαŸ–

hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set("parquet.enable.summary-metadata", "false")
hadoopConf.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")

αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžαžΆαž₯αž‘αžΌαžœαž“αŸαŸ‡αž‡αžΆαžšαŸ€αž„αžšαžΆαž›αŸ‹αžαŸ’αž„αŸƒ αž—αžΆαž‚αžαžΆαžŸ parquet αžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αžαžαž―αž€αžŸαžΆαžšαž”αž„αŸ’αž αžΆαž‰αž‚αŸ„αž›αžŠαŸ… αžŠαŸ‚αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž‰αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž„αŸƒαž“αŸ„αŸ‡αžŸαŸ’αžαž·αžαž“αŸ…αŸ” αž™αžΎαž„αž”αžΆαž“αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž‡αžΆαž˜αž»αž“αžαžΆαž˜αž·αž“αž˜αžΆαž“αž—αžΆαž‚αžαžΆαžŸαžŠαŸ‚αž›αž˜αžΆαž“αž‡αž˜αŸ’αž›αŸ„αŸ‡αž”αŸ’αžšαž—αŸαž‘αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸαŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž‘αžΈαž”αžΈαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž‘αžΌαž‘αŸ…αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŠαžΉαž„αž“αŸ„αŸ‡αž‘αŸ αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αžαžΆαžšαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Hive αž˜αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αžŠαŸ„αž™αžŸαžΆαžšαž—αžΆαž‚αžαžΆαžŸαžαŸ’αž˜αžΈαž“αžΈαž˜αž½αž™αŸ—αž‘αŸ†αž“αž„αž‡αžΆαžŽαŸ‚αž“αžΆαŸ†αž€αžΆαžšαž”αž„αŸ’αžαžΌαž…αž‘αŸ’αžšαž„αŸ‹αž‘αŸ’αžšαžΆαž™αž‘αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαŸ”

αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžšαžΆαž„αž‘αžΎαž„αžœαž·αž‰αŸ” αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αžŸαžΆαž˜αž‰αŸ’αž‰: αž’αžΆαž“ parquet αž“αŸƒ storefront αž˜αŸ’αžαž„αž‘αŸ€αž, αž™αž€αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αž·αž„αž”αž„αŸ’αž€αžΎαž DDL αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαžΆ, αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŠαŸ‚αž›αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžαž˜αŸ’αžαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„ Hive αž‡αžΆαžαžΆαžšαžΆαž„αžαžΆαž„αž€αŸ’αžšαŸ…, αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸƒ storefront αž‚αŸ„αž›αžŠαŸ…αŸ”

αž™αžΎαž„αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž‘αžΈαž”αž½αž“αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžšαžΆαž„αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž›αžΎ Spark αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž αžΎαž™αž™αžΎαž„αžαŸ’αžšαžΌαžœαž…αžΆαŸ†αžαžΆαžœαžΆαž› parquet αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž½αž’αž€αŸ’αžŸαžšαžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Hive αŸ” αž§αž‘αžΆαž αžšαžŽαŸ Spark αž”αŸ„αŸ‡αž…αŸ„αž›αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‰αŸ‚αž€αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› "corrupt_record" αŸ” αžœαžΆαž›αž”αŸ‚αž”αž“αŸαŸ‡αž˜αž·αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ Hive αžŠαŸ„αž™αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžαŸ‹αž‚αŸαž…αžαŸ’αž›αž½αž“αŸ”

αžŠαŸ„αž™αžŠαžΉαž„αžšαžΏαž„αž“αŸαŸ‡αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαŸ–

f_def = ""
for f in pf.dtypes:
  if f[0] != "date_load":
    f_def = f_def + "," + f[0].replace("_corrupt_record", "`_corrupt_record`") + " " + f[1].replace(":", "`:").replace("<", "<`").replace(",", ",`").replace("array<`", "array<") 
table_define = "CREATE EXTERNAL TABLE jsonevolvtable (" + f_def[1:] + " ) "
table_define = table_define + "PARTITIONED BY (date_load string) STORED AS PARQUET LOCATION '/user/admin/testJson/testSchemaEvolution/pq/'"
hc.sql("drop table if exists jsonevolvtable")
hc.sql(table_define)

αž›αŸαžαž€αžΌαžŠ ("_corrupt_record", "`_corrupt_record`") + " " + f[1].replace(":", "`:").replace("<", "<`").replace(",", ",`").αž‡αŸ†αž“αž½αžŸ("ធអរេ<`", "ធអរេ<") αž’αŸ’αžœαžΎαž±αŸ’αž™ DDL αž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž–αŸ„αž›αž‚αžΊαž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αŸ–

create table tname (_field1 string, 1field string)

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαž›αžŠαžΌαž…αž‡αžΆ "_field1, 1field" αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– DDL αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž…αž…αŸαž‰αŸ– αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„ `tname` (`_field1` string, `1field` string)αŸ”

αžŸαŸ†αžŽαž½αžšαž€αžΎαžαž‘αžΎαž„: αžšαž”αŸ€αž”αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αžŸαŸŠαž»αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž±αŸ’αž™αž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž–αŸαž‰αž›αŸαž‰ (αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠ pf)? αžαžΎαž’αŸ’αžœαžΎαžŠαžΌαž…αž˜αŸ’αžαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“ pf αž“αŸαŸ‡? αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αž‰αŸ’αž αžΆαž‘αžΈαž”αŸ’αžšαžΆαŸ†αŸ” αž’αžΆαž“αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸƒαž—αžΆαž‚αžαžΆαžŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαžαžαž―αž€αžŸαžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž―αž€αžŸαžΆαžš parquet αž“αŸƒαž€αž“αŸ’αž›αŸ‚αž„αžαžΆαŸ†αž„αž”αž„αŸ’αž αžΆαž‰αž‚αŸ„αž›αžŠαŸ…? αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž‚αžΊαž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž”αŸ†αž•αž»αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αž·αž”αžΆαž€αŸ”

αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž˜αžΆαž“αžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Hive αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžαŸ’αž˜αžΈαžŠαŸ„αž™αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸƒαžαžΆαžšαžΆαž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αž·αž„αž—αžΆαž‚αžαžΆαžŸαžαŸ’αž˜αžΈαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž™αž€αžαžΆαžšαžΆαž„ schema αž–αžΈ Hive αž αžΎαž™αž•αŸ’αžŸαŸ†αžœαžΆαž‡αžΆαž˜αž½αž™ schema αž“αŸƒ partition αžαŸ’αž˜αžΈαŸ” αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž€αžΆαžšαž’αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαžαžΆαžŸαžΆαž€αž›αŸ’αž”αž„αž–αžΈ Hive αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžαžαž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ αž αžΎαž™αž”αŸ’αžšαžΎ Spark αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αž—αžΆαž‚αžαžΆαžŸαž‘αžΆαŸ†αž„αž–αžΈαžšαž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αŸ”

αžαžΆαž˜αž€αžΆαžšαž–αž·αžαž˜αžΆαž“αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžš: αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžαžΆαžšαžΆαž„αžŠαžΎαž˜αž“αŸ…αž€αŸ’αž“αž»αž„ Hive αž“αž·αž„αž—αžΆαž‚αžαžΆαžŸαžαŸ’αž˜αžΈαŸ” αž™αžΎαž„αž€αŸαž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αž„αžŠαŸ‚αžšαŸ” αžœαžΆαž“αŸ…αžŸαž›αŸ‹αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžαŸ’αž˜αžΈαžŠαŸ‚αž›αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž˜αž»αžαž αžΆαž„ αž“αž·αž„αžœαžΆαž›αžαŸ’αž˜αžΈαž–αžΈαž—αžΆαž‚αžαžΆαžŸαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ–

from pyspark.sql import HiveContext
from pyspark.sql.functions import lit
hc = HiveContext(spark)
df = spark.read.json("...", dropFieldIfAllNull=True)
df.write.mode("overwrite").parquet(".../date_load=12-12-2019")
pe = hc.sql("select * from jsonevolvtable limit 1")
pe.write.mode("overwrite").parquet(".../fakePartiton/")
pf = spark.read.option("mergeSchema", True).parquet(".../date_load=12-12-2019/*", ".../fakePartiton/*")

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ DDL αžŠαžΌαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž˜αž»αž“αžŠαŸ‚αžšαŸ”
αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹αž‘αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž–αŸ„αž›αž‚αžΊαž˜αžΆαž“αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αž•αŸ’αž‘αž»αž€ αž αžΎαž™αžαžΆαžšαžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž™αŸ‰αžΆαž„αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸ…αž€αŸ’αž“αž»αž„ Hive αž“αŸ„αŸ‡αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžαžΆαžšαžΆαž„αžαžΆαžšαžΆαž„αžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αŸ”

αž αžΎαž™αž”αž‰αŸ’αž αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαžαžΆαž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž‚αžαžΆαžŸαž‘αŸ…αžαžΆαžšαžΆαž„ Hive αž‘αŸαž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž“αžΉαž„αžαžΌαž…αŸ” αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αžαŸ† Hive αžŠαžΎαž˜αŸ’αž”αžΈαž‡αž½αžŸαž‡αž»αž›αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž—αžΆαž‚αžšαž”αžŸαŸ‹αžœαžΆαŸ–

from pyspark.sql import HiveContext
hc = HiveContext(spark) 
hc.sql("MSCK REPAIR TABLE " + db + "." + destTable)

αž—αžΆαžšαž€αž·αž…αŸ’αž…αžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸƒαž€αžΆαžšαž’αžΆαž“ JSON αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž˜αž»αžαž αžΆαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαžΆαž“αžΆαŸ†αž±αŸ’αž™αž™αž€αžˆαŸ’αž“αŸ‡αž›αžΎαž€αžΆαžšαž›αŸ†αž”αžΆαž€αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž‡αžΆαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžšαž€αž˜αžΎαž›αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαŸ” αž αžΎαž™αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαžΆαž˜αž‰αŸ’αž‰αž€αŸαžŠαŸ„αž™ αž€αŸαžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αŸαž›αž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€αž–αž½αž€αž‚αŸαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž€αžΆαžšβ€‹αžŸαžΆαž„αžŸαž„αŸ‹β€‹αž”αž“αŸ’αž‘αž”αŸ‹β€‹αžαžΆαŸ†αž„β€‹αž”αž„αŸ’αž αžΆαž‰ αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αŸ–

  • αž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž‚αžαžΆαžŸαž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžαžΆαŸ†αž„αž”αž„αŸ’αž αžΆαž‰ αž€αž˜αŸ’αž…αžΆαžαŸ‹αž―αž€αžŸαžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜
  • αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αžœαžΆαž›αž‘αž‘αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž–αžŠαŸ‚αž› Spark αž”αžΆαž“αžœαžΆαž™αž”αž‰αŸ’αž…αžΌαž›
  • αž”αŸ„αŸ‡αž”αŸ’αžšαž—αŸαž‘αžŸαžΆαž˜αž‰αŸ’αž‰αž‘αŸ…αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš
  • αž”αŸ†αž”αŸ’αž›αŸ‚αž„αžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαž›αž‘αŸ…αž‡αžΆαž’αž€αŸ’αžŸαžšαžαžΌαž…
  • αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αž“αž·αž„αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžšαžΆαž„αž€αŸ’αž“αž»αž„ Hive (αž‡αŸ†αž“αžΆαž“αŸ‹ DDL)
  • αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž‚αŸαž…αž–αžΈαžˆαŸ’αž˜αŸ„αŸ‡αžœαžΆαž›αžŠαŸ‚αž›αž’αžΆαž…αž˜αž·αž“αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ Hive
  • αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžšαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Hive

αžŸαžšαž»αž”αž˜αž€ αž™αžΎαž„αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŸαžΆαž„αžŸαž„αŸ‹αž”αž„αŸ’αž’αž½αž…αž αžΆαž„αž‚αžΊαž–αŸ„αžšαž–αŸαž‰αžŠαŸ„αž™αž—αžΆαž–αž›αŸ†αž”αžΆαž€αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αžΆαž€αŸ‹αž‘αž„αžŠαŸƒαž‚αžΌαžŠαŸ‚αž›αž˜αžΆαž“αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž‡αŸ„αž‚αž‡αŸαž™αŸ”

αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αžΆαž“αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αŸ’αž“αž€αžšαž€αžƒαžΎαž‰αž–αŸαžαŸŒαž˜αžΆαž“αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹