در ساده ترین شکل ، منبع داده پیش فرض (پارکت مگر اینکه در غیر این صورت توسط Spark. sql. source. default پیکربندی شده باشد) برای همه عملیات استفاده می شود.
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
گزینه های دستی را به صورت دستی مشخص کنید
همچنین می توانید منبع داده ای را که به همراه هر گزینه دیگری که می خواهید به منبع داده منتقل کنید ، به صورت دستی مشخص کنید. منابع داده با نام کاملاً واجد شرایط آنها (به عنوان مثال ، org. apache. spark. sql. parquet) مشخص شده است ، اما برای منابع داخلی نیز می توانید از نام های کوتاه آنها استفاده کنید (JSON ، PARQUET ، JDBC ، ORC ، LIBSVM ، CSV ، TEXT). DataFrames بارگذاری شده از هر نوع منبع داده می تواند با استفاده از این نحو به انواع دیگر تبدیل شود.
لطفاً به اسناد API برای گزینه های موجود از منابع داخلی ، به عنوان مثال ، org. apache. spark. sql. dataframereader و org. apache. spark. sql. dataframewriter مراجعه کنید. گزینه های مستند شده در آنجا باید از طریق API های SPARK غیر SCALA (به عنوان مثال Pyspark) نیز قابل اجرا باشد. برای قالب های دیگر ، به مستندات API از قالب خاص مراجعه کنید.
برای بارگذاری یک فایل JSON می توانید استفاده کنید:
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
برای بارگیری پرونده CSV می توانید از آن استفاده کنید:
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
گزینه های اضافی نیز در هنگام کار نوشتن استفاده می شود. به عنوان مثال ، می توانید فیلترهای Bloom و رمزگذاری فرهنگ لغت را برای منابع داده ORC کنترل کنید. مثال ORC زیر فیلتر Bloom را ایجاد می کند و از فرهنگ لغت استفاده می کند که فقط برای مورد علاقه_ color رمزگذاری می شود. برای پارکت ، parquet. bloom. filter. enabled و parquet. enable. dectionary نیز وجود دارد. برای یافتن اطلاعات دقیق تر در مورد گزینه های اضافی ORC / Parquet ، به وب سایت های رسمی Apache ORC / Parquet مراجعه کنید.
منبع داده ORC:
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
منبع داده پارکت:
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
SQL را مستقیماً روی پرونده ها اجرا کنید
به جای استفاده از API Read برای بارگذاری یک پرونده در DataFrame و پرس و جو ، می توانید آن پرونده را مستقیماً با SQL پرس و جو کنید.
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
ذخیره حالت ها
عملیات ذخیره به صورت اختیاری میتواند یک SaveMode داشته باشد که نحوه مدیریت دادههای موجود را در صورت وجود مشخص میکند. توجه به این نکته مهم است که این حالت های ذخیره از هیچ قفلی استفاده نمی کنند و اتمی نیستند. علاوه بر این، هنگام انجام بازنویسی، داده ها قبل از نوشتن داده های جدید حذف می شوند.
اسکالا/جاوا | هر زبانی | معنی |
---|---|---|
SaveMode. ErrorIfExists (پیشفرض) | "خطا" یا "خطا وجود دارد" (پیشفرض) | هنگام ذخیره یک DataFrame در منبع داده، اگر داده از قبل وجود داشته باشد، انتظار می رود که یک استثنا ایجاد شود. |
SaveMode. Append | "ضمیمه" | هنگام ذخیره یک DataFrame در منبع داده، اگر داده/جدول از قبل وجود داشته باشد، انتظار می رود محتویات DataFrame به داده های موجود اضافه شود. |
SaveMode. Overwrite | "زیاد نوشتن" | حالت رونویسی به این معنی است که هنگام ذخیره یک DataFrame در منبع داده، اگر داده/جدول از قبل وجود داشته باشد، انتظار می رود داده های موجود توسط محتویات DataFrame بازنویسی شوند. |
SaveMode. نادیده بگیرید | "چشم پوشی" | حالت نادیده گرفتن به این معنی است که هنگام ذخیره یک DataFrame در منبع داده، اگر داده از قبل وجود داشته باشد، انتظار می رود عملیات ذخیره محتویات DataFrame را ذخیره نکند و داده های موجود را تغییر ندهد. این شبیه به CREATE TABLE IF NOT EXISTS در SQL است. |
ذخیره در جداول پایدار
DataFrames همچنین میتواند بهعنوان جداول دائمی در metastore Hive با استفاده از دستور saveAsTable ذخیره شود. توجه داشته باشید که استقرار Hive موجود برای استفاده از این ویژگی ضروری نیست. Spark یک متاستوری پیش فرض محلی Hive (با استفاده از Derby) برای شما ایجاد می کند. بر خلاف دستور createOrReplaceTempView، saveAsTable محتویات DataFrame را عملی می کند و یک اشاره گر به داده ها در metastore Hive ایجاد می کند. تا زمانی که اتصال خود را به همان متاستور حفظ کنید، حتی پس از راه اندازی مجدد برنامه Spark، جداول پایدار همچنان وجود خواهند داشت. با فراخوانی متد جدول در SparkSession با نام جدول می توان یک DataFrame برای یک جدول پایدار ایجاد کرد.
برای منبع داده مبتنی بر فایل، به عنوان مثال. متن، پارکت، json و غیره می توانید یک مسیر جدول سفارشی را از طریق گزینه path مشخص کنید، به عنوان مثال. df. write. option("path", "/some/path"). saveAsTable("t") . هنگامی که جدول حذف می شود، مسیر جدول سفارشی حذف نمی شود و داده های جدول هنوز وجود دارد. اگر مسیر جدول سفارشی مشخص نشده باشد، Spark دادهها را در مسیر جدول پیشفرض زیر فهرست انبار مینویسد. هنگامی که جدول حذف می شود، مسیر جدول پیش فرض نیز حذف خواهد شد.
با شروع از Spark 2. 1، جداول منبع داده دائمی دارای ابرداده هر پارتیشن در متاستور Hive هستند. این چندین مزیت به همراه دارد:
- از آنجایی که متاستور میتواند تنها پارتیشنهای لازم برای یک کوئری را برگرداند، دیگر نیازی به کشف تمام پارتیشنهای اولین کوئری به جدول نیست.
- DDLهای کندو مانند ALTER TABLE PARTITION. SET LOCATION اکنون برای جداول ایجاد شده با Datasource API در دسترس است.
توجه داشته باشید که هنگام ایجاد جداول منبع داده خارجی (آنهایی که دارای گزینه مسیر هستند) اطلاعات پارتیشن به طور پیش فرض جمع آوری نمی شود. برای همگام سازی اطلاعات پارتیشن در متاستور، می توانید MSCK REPAIR TABLE را فراخوانی کنید.
سطل بندی، مرتب سازی و پارتیشن بندی
برای منبع داده مبتنی بر فایل، امکان سطل و مرتب سازی یا پارتیشن بندی خروجی نیز وجود دارد. سطل بندی و مرتب سازی فقط برای جداول ثابت قابل اعمال است:
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
در حالی که می توان از پارتیشن بندی در هنگام استفاده از API های مجموعه داده استفاده کرد.
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
استفاده از پارتیشن بندی و سطل برای یک جدول واحد امکان پذیر است:
کد مثال کامل را در "نمونه ها/src/main/scala/org/apache/spark/مثال/sql/sqldatasourceexample. scala" در repo Spark پیدا کنید.
کد مثال کامل را در "نمونه ها/src/main/java/org/apache/spark/نمونه ها/sql/javasqldatasourceexample. java" پیدا کنید.
PartitionBy یک ساختار فهرست را همانطور که در بخش کشف پارتیشن شرح داده شده است ، ایجاد می کند. بنابراین ، کاربرد محدودی در ستون هایی با کاردینال بودن بالا دارد. در کنتراست Bucketby داده ها را در تعداد مشخصی از سطل توزیع می کند و در صورت عدم اتصال تعداد مقادیر منحصر به فرد می تواند مورد استفاده قرار گیرد.<SPAN> در حالی که می توان از پارتیشن بندی در هنگام استفاده از API های داده استفاده کرد و قابل استفاده باشد.