forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: Hasko, Vladimir <vladimir.hasko@t-systems.com> Co-committed-by: Hasko, Vladimir <vladimir.hasko@t-systems.com>
221 lines
22 KiB
HTML
221 lines
22 KiB
HTML
<a name="dli_09_0084"></a><a name="dli_09_0084"></a>
|
|
|
|
<h1 class="topictitle1">PySpark Example Code</h1>
|
|
<div id="body8662426"><div class="section" id="dli_09_0084__section1298320491445"><h4 class="sectiontitle">Development Description</h4><ul id="dli_09_0084__ul1384614244520"><li id="dli_09_0084__li158465249510">Prerequisites<p id="dli_09_0084__en-us_topic_0197738136_p1944354710257"><a name="dli_09_0084__li158465249510"></a><a name="li158465249510"></a>A datasource connection has been created and bound to a queue on the DLI management console. </p>
|
|
<div class="note" id="dli_09_0084__note1358715714155"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="dli_09_0084__p1858718570154">Hard-coded or plaintext passwords pose significant security risks. To ensure security, encrypt your passwords, store them in configuration files or environment variables, and decrypt them when needed.</p>
|
|
</div></div>
|
|
</li><li id="dli_09_0084__li1412720381064">Code implementation<ol id="dli_09_0084__en-us_topic_0197738136_ol12123050181818"><li id="dli_09_0084__en-us_topic_0197738136_li1612316509182">Import dependency packages.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen195374592114"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">print_function</span>
|
|
<span class="kn">from</span> <span class="nn">pyspark.sql.types</span> <span class="kn">import</span> <span class="n">StructType</span><span class="p">,</span> <span class="n">StructField</span><span class="p">,</span> <span class="n">IntegerType</span><span class="p">,</span> <span class="n">StringType</span>
|
|
<span class="kn">from</span> <span class="nn">pyspark.sql</span> <span class="kn">import</span> <span class="n">SparkSession</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li11272141817195">Create a session.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen2658132002217"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">sparkSession</span> <span class="o">=</span> <span class="n">SparkSession</span><span class="o">.</span><span class="n">builder</span><span class="o">.</span><span class="n">appName</span><span class="p">(</span><span class="s2">"datasource-rds"</span><span class="p">)</span><span class="o">.</span><span class="n">getOrCreate</span><span class="p">()</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li></ol>
|
|
</li><li id="dli_09_0084__li2861202777">Connecting to data sources through DataFrame APIs<ol id="dli_09_0084__en-us_topic_0197738136_ol62934313101"><li id="dli_09_0084__en-us_topic_0197738136_li4293143141018">Configure datasource connection parameters.<div class="codecoloring" codetype="Python" id="dli_09_0084__screen1443820538378"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">url</span> <span class="o">=</span> <span class="s2">"jdbc:mysql://to-rds-1174404952-ZgPo1nNC.datasource.com:3306"</span>
|
|
<span class="n">dbtable</span> <span class="o">=</span> <span class="s2">"test.customer"</span>
|
|
<span class="n">user</span> <span class="o">=</span> <span class="s2">"root"</span>
|
|
<span class="n">password</span> <span class="o">=</span> <span class="s2">"######"</span>
|
|
<span class="n">driver</span> <span class="o">=</span> <span class="s2">"com.mysql.jdbc.Driver"</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="dli_09_0084__p1221175418375">For details about the parameters, see <a href="dli_09_0067.html#dli_09_0067__en-us_topic_0190647826_table127421320141311">Table 1</a>.</p>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li092612314321">Set data.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen2630833512"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">dataList</span> <span class="o">=</span> <span class="n">sparkSession</span><span class="o">.</span><span class="n">sparkContext</span><span class="o">.</span><span class="n">parallelize</span><span class="p">([(</span><span class="mi">123</span><span class="p">,</span> <span class="s2">"Katie"</span><span class="p">,</span> <span class="mi">19</span><span class="p">)])</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li531012517114">Configure the schema.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen2083911515127"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">schema</span> <span class="o">=</span> <span class="n">StructType</span><span class="p">([</span><span class="n">StructField</span><span class="p">(</span><span class="s2">"id"</span><span class="p">,</span> <span class="n">IntegerType</span><span class="p">(),</span> <span class="kc">False</span><span class="p">),</span>\
|
|
<span class="n">StructField</span><span class="p">(</span><span class="s2">"name"</span><span class="p">,</span> <span class="n">StringType</span><span class="p">(),</span> <span class="kc">False</span><span class="p">),</span>\
|
|
<span class="n">StructField</span><span class="p">(</span><span class="s2">"age"</span><span class="p">,</span> <span class="n">IntegerType</span><span class="p">(),</span> <span class="kc">False</span><span class="p">)])</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li4741141821116">Create a DataFrame.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen1520319134349"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">dataFrame</span> <span class="o">=</span> <span class="n">sparkSession</span><span class="o">.</span><span class="n">createDataFrame</span><span class="p">(</span><span class="n">dataList</span><span class="p">,</span> <span class="n">schema</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li10107173841110">Save data to RDS.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen819352983615"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span>
|
|
<span class="normal">8</span>
|
|
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">dataFrame</span><span class="o">.</span><span class="n">write</span> \
|
|
<span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">"jdbc"</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"url"</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"dbtable"</span><span class="p">,</span> <span class="n">dbtable</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"user"</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"password"</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"driver"</span><span class="p">,</span> <span class="n">driver</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">mode</span><span class="p">(</span><span class="s2">"Append"</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">save</span><span class="p">()</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<div class="note" id="dli_09_0084__en-us_topic_0197738136_note211743503718"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="dli_09_0084__en-us_topic_0197738136_p039712487568">The value of <strong id="dli_09_0084__en-us_topic_0197738136_b69621617373">mode</strong> can be one of the following:</p>
|
|
<ul id="dli_09_0084__en-us_topic_0197738136_ul16164620151513"><li id="dli_09_0084__en-us_topic_0197738136_li1416452015156"><strong id="dli_09_0084__b66967341297">ErrorIfExis</strong>: If the data already exists, the system throws an exception.</li><li id="dli_09_0084__en-us_topic_0197738136_li191651720151518"><strong id="dli_09_0084__b9327103722917">Overwrite</strong>: If the data already exists, the original data will be overwritten.</li><li id="dli_09_0084__en-us_topic_0197738136_li10165620111513"><strong id="dli_09_0084__b9977193910293">Append</strong>: If the data already exists, the system saves the new data.</li><li id="dli_09_0084__en-us_topic_0197738136_li181651720161514"><strong id="dli_09_0084__b1225904410295">Ignore</strong>: If the data already exists, no operation is required. This is similar to the SQL statement <strong id="dli_09_0084__en-us_topic_0197738136_b796011517378">CREATE TABLE IF NOT EXISTS</strong>.</li></ul>
|
|
</div></div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li1956013474119">Read data from RDS.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen725913206384"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span>
|
|
<span class="normal">8</span>
|
|
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">jdbcDF</span> <span class="o">=</span> <span class="n">sparkSession</span><span class="o">.</span><span class="n">read</span> \
|
|
<span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">"jdbc"</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"url"</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"dbtable"</span><span class="p">,</span> <span class="n">dbtable</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"user"</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"password"</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">"driver"</span><span class="p">,</span> <span class="n">driver</span><span class="p">)</span> \
|
|
<span class="o">.</span><span class="n">load</span><span class="p">()</span>
|
|
<span class="n">jdbcDF</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li04211550135317">View the operation result.<p id="dli_09_0084__en-us_topic_0197738136_p17961222115616"><a name="dli_09_0084__en-us_topic_0197738136_li04211550135317"></a><a name="en-us_topic_0197738136_li04211550135317"></a><span><img id="dli_09_0084__en-us_topic_0197738136_image1495192295619" src="en-us_image_0223997424.png"></span></p>
|
|
</li></ol>
|
|
</li><li id="dli_09_0084__li1493820415814">Connecting to data sources through SQL APIs<ol id="dli_09_0084__en-us_topic_0197738136_ol17267124119287"><li id="dli_09_0084__en-us_topic_0197738136_li62671411286">Create a table to connect to an RDS data source and set connection parameters.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen1776226122416"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">sparkSession</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span>
|
|
<span class="s2">"CREATE TABLE IF NOT EXISTS dli_to_rds USING JDBC OPTIONS (</span><span class="se">\</span>
|
|
<span class="s2"> 'url'='jdbc:mysql://to-rds-1174404952-ZgPo1nNC.datasource.com:3306',</span><span class="se">\</span>
|
|
<span class="s2"> 'dbtable'='test.customer',</span><span class="se">\</span>
|
|
<span class="s2"> 'user'='root',</span><span class="se">\</span>
|
|
<span class="s2"> 'password'='######',</span><span class="se">\</span>
|
|
<span class="s2"> 'driver'='com.mysql.jdbc.Driver')"</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="dli_09_0084__p1149202110">For details about the parameters for creating a table, see <a href="dli_09_0067.html#dli_09_0067__en-us_topic_0190647826_table127421320141311">Table 1</a>.</p>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li498164912282">Insert data.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen1471435132916"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">sparkSession</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="s2">"insert into dli_to_rds values(3,'John',24)"</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li56921323133011">Query data.<div class="codecoloring" codetype="Python" id="dli_09_0084__en-us_topic_0197738136_screen1694434817304"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">jdbcDF_after</span> <span class="o">=</span> <span class="n">sparkSession</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="s2">"select * from dli_to_rds"</span><span class="p">)</span>
|
|
<span class="n">jdbcDF_after</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="dli_09_0084__en-us_topic_0197738136_li3561229539">View the operation result.<p id="dli_09_0084__en-us_topic_0197738136_p152514315569"><a name="dli_09_0084__en-us_topic_0197738136_li3561229539"></a><a name="en-us_topic_0197738136_li3561229539"></a><span><img id="dli_09_0084__en-us_topic_0197738136_image1256435562" src="en-us_image_0223997425.png"></span></p>
|
|
</li></ol>
|
|
</li><li id="dli_09_0084__li1678113818818">Submitting a Spark job<ol id="dli_09_0084__en-us_topic_0197738136_ol612481914610"><li id="dli_09_0084__li20219124092717">Upload the Python code file to DLI.<p id="dli_09_0084__p1171334542713"><a name="dli_09_0084__li20219124092717"></a><a name="li20219124092717"></a></p>
|
|
<p id="dli_09_0084__p12725164132719"></p>
|
|
</li><li id="dli_09_0084__li81629492275">In the Spark job editor, select the corresponding dependency module and execute the Spark job.<p id="dli_09_0084__p14975165282715"><a name="dli_09_0084__li81629492275"></a><a name="li81629492275"></a></p>
|
|
<p id="dli_09_0084__p2046613504276"></p>
|
|
</li><li id="dli_09_0084__li102392517591">After the Spark job is created, click <strong id="dli_09_0084__b11961518103810">Execute</strong> in the upper right corner of the console to submit the job. If the message "Spark job submitted successfully." is displayed, the Spark job is successfully submitted. You can view the status and logs of the submitted job on the <strong id="dli_09_0084__b0568493395">Spark Jobs</strong> page.<div class="note" id="dli_09_0084__note19239175115918"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><ul id="dli_09_0084__ul1823911545916"><li id="dli_09_0084__li202386535919">The queue you select for creating a Spark job is the one bound when you create the datasource connection.</li><li id="dli_09_0084__en-us_topic_0197738142_li58215295819">If the Spark version is 2.3.2 (will be offline soon) or 2.4.5, specify the <strong id="dli_09_0084__b1574617395504">Module</strong> to <strong id="dli_09_0084__b1474693915017">sys.datasource.rds</strong> when you submit a job.</li><li id="dli_09_0084__li6624653171317">If the Spark version is 3.1.1, you do not need to select a module. Configure <strong id="dli_09_0084__b881131918503">Spark parameters (--conf)</strong>.<p id="dli_09_0084__p131071216162710">spark.driver.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/rds/*</p>
|
|
<p id="dli_09_0084__p210761614275">spark.executor.extraClassPath=/usr/share/extension/dli/spark-jar/datasource/rds/*</p>
|
|
</li></ul>
|
|
</div></div>
|
|
</li></ol>
|
|
</li></ul>
|
|
</div>
|
|
<div class="section" id="dli_09_0084__section168931223131020"><h4 class="sectiontitle">Complete Example Code</h4><div class="note" id="dli_09_0084__note634017436469"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="dli_09_0084__p43407436467">If the following sample code is directly copied to the <strong id="dli_09_0084__b418712444420">.py</strong> file, note that unexpected characters may exist after the backslashes (\) in the file content. You need to delete the indentations or spaces after the backslashes (\).</p>
|
|
</div></div>
|
|
<ul id="dli_09_0084__ul1572356104"><li id="dli_09_0084__li957133517105">Connecting to data sources through DataFrame APIs<pre class="screen" id="dli_09_0084__screen6577153893414"># _*_ coding: utf-8 _*_
|
|
from __future__ import print_function
|
|
from pyspark.sql.types import StructType, StructField, IntegerType, StringType
|
|
from pyspark.sql import SparkSession
|
|
if __name__ == "__main__":
|
|
# Create a SparkSession session.
|
|
sparkSession = SparkSession.builder.appName("datasource-rds").getOrCreate()
|
|
|
|
# Set cross-source connection parameters.
|
|
url = "jdbc:mysql://to-rds-1174404952-ZgPo1nNC.datasource.com:3306"
|
|
dbtable = "test.customer"
|
|
user = "root"
|
|
password = "######"
|
|
driver = "com.mysql.jdbc.Driver"
|
|
|
|
# Create a DataFrame and initialize the DataFrame data.
|
|
dataList = sparkSession.sparkContext.parallelize([(123, "Katie", 19)])
|
|
|
|
# Setting schema
|
|
schema = StructType([StructField("id", IntegerType(), False),\
|
|
StructField("name", StringType(), False),\
|
|
StructField("age", IntegerType(), False)])
|
|
|
|
# Create a DataFrame from RDD and schema
|
|
dataFrame = sparkSession.createDataFrame(dataList, schema)
|
|
|
|
# Write data to the RDS.
|
|
dataFrame.write \
|
|
.format("jdbc") \
|
|
.option("url", url) \
|
|
.option("dbtable", dbtable) \
|
|
.option("user", user) \
|
|
.option("password", password) \
|
|
.option("driver", driver) \
|
|
.mode("Append") \
|
|
.save()
|
|
|
|
# Read data
|
|
jdbcDF = sparkSession.read \
|
|
.format("jdbc") \
|
|
.option("url", url) \
|
|
.option("dbtable", dbtable) \
|
|
.option("user", user) \
|
|
.option("password", password) \
|
|
.option("driver", driver) \
|
|
.load()
|
|
jdbcDF.show()
|
|
|
|
# close session
|
|
sparkSession.stop()</pre>
|
|
</li><li id="dli_09_0084__li62511314127">Connecting to data sources through SQL APIs<pre class="screen" id="dli_09_0084__screen3263122763519"># _*_ coding: utf-8 _*_
|
|
from __future__ import print_function
|
|
from pyspark.sql import SparkSession
|
|
|
|
if __name__ == "__main__":
|
|
# Create a SparkSession session.
|
|
sparkSession = SparkSession.builder.appName("datasource-rds").getOrCreate()
|
|
|
|
# Create a data table for DLI - associated RDS
|
|
sparkSession.sql(
|
|
"CREATE TABLE IF NOT EXISTS dli_to_rds USING JDBC OPTIONS (\
|
|
'url'='jdbc:mysql://to-rds-1174404952-ZgPo1nNC.datasource.com:3306',\
|
|
'dbtable'='test.customer',\
|
|
'user'='root',\
|
|
'password'='######',\
|
|
'driver'='com.mysql.jdbc.Driver')")
|
|
|
|
# Insert data into the DLI data table
|
|
sparkSession.sql("insert into dli_to_rds values(3,'John',24)")
|
|
|
|
# Read data from DLI data table
|
|
jdbcDF = sparkSession.sql("select * from dli_to_rds")
|
|
jdbcDF.show()
|
|
|
|
# close session
|
|
sparkSession.stop()</pre>
|
|
</li></ul>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="dli_09_0083.html">Connecting to RDS</a></div>
|
|
</div>
|
|
</div>
|
|
|