Sam*_*Sam -5 python scala apache-spark
我在 Scala 中有这段代码,但对 Python 不太熟悉,无法转换它:
val formatterComma = java.text.NumberFormat.getIntegerInstance
def createTD(value: String) : String = {
return s"""<td align="center" style="border:1px solid">${value}</td>"""
}
def createTD(value: BigInt) : String = {
return createTD(value.toString)
}
def createTDDouble(value: Double) : String = {
return createTD("$" + formatterComma.format(value))
}
def createTheLink(productId: String) : String = {
return s"""<td align="center" style="border:1px solid"><a href="https://productLink/$product>Link Here</a></td>"""
}
def createTH(value: String) : String = {
return s"""<th class="gmail-highlight-red gmail-confluenceTh gmail-tablesorter-header gmail-sortableHeader gmail-tablesorter-headerUnSorted" tabindex="0" scope="col" style="width:1px;white-space:nowrap;border:1px solid #000000;padding:7px 15px 7px 10px;vertical-align:top;text-align:center;background:100% 50% no-repeat">
<div class="gmail-tablesorter-header-inner" style="margin:0px;padding:0px"><h2 title="" style="margin:0.2px 0px 0px;padding:0px;font-size:20px;font-weight:normal;line-height:1.5;letter-spacing:-0.008em;border-bottom-color:rgb(50,199,208))"><strong>${value}</strong></h2>
</div>
</th>"""
}
final case class resultsOfReport (name: String, email: String, phone:String, productId : String, product: String, cost : Double, reduction : Double);
def runReport(elements: Array[resultsOfReport]): String = {
return elements.map {
case resultsOfReport (name, email, phone, productId, product, cost, stillInStock)
=> s"""<tr>${createTD(name)}${createTD(email)}${createTD(phone)}${createTD(productId)}${createTD(product)}${createTDDouble(cost)}${createTDDouble(reduction)}${createTheLink(productId)}${createTD("Link to product")}</tr>"""
}.mkString(s"""<table class="gmail-relative-table gmail-confluenceTable gmail-tablesorter gmail-tablesorter-default" style="border-collapse:collapse; margin:0px;overflow-x:auto;width:1200px"><tr>
${createTH("Name")}
${createTH("Email")}
${createTH("Phone")}
${createTH("ProductId")}
${createTH("Product")}
${createTH("Cost")}
${createTH("Reduction")}
${createTH("Link")}
</tr>""","",
"</table>")
}
Run Code Online (Sandbox Code Playgroud)
它接收通过 runReport 方法传递的数据并将其映射到适当的列。用我发送的数据创建一个表。
我需要能够在其中使用 python 方法,并且不能在 databricks 的 Scala 中调用 python 方法。
我已经开始转换它,但后来被困在如何使它像 scala 方法一样工作:
from dataclasses import dataclass
@dataclass
class runReport:
name: str
email: str
phone: str
productId: str
product: str
cost: float
reduction: float
def runReport(runReport):
Run Code Online (Sandbox Code Playgroud)
编辑:所以从尝试的东西。我想我唯一需要做的就是弄清楚如何在 python 中完成这部分:
return elements.map {
case resultsOfReport (name, email, phone, productId, product, cost, stillInStock)
=> s"""<tr>${createTD(name)}${createTD(email)}${createTD(phone)}${createTD(productId)}${createTD(product)}${createTDDouble(cost)}${createTDDouble(reduction)}${createTheLink(productId)}${createTD("Link to product")}</tr>"""
}.mkString(s"""<table class="gmail-relative-table gmail-confluenceTable gmail-tablesorter gmail-tablesorter-default" style="border-collapse:collapse; margin:0px;overflow-x:auto;width:1200px"><tr>
${createTH("Name")}
${createTH("Email")}
${createTH("Phone")}
${createTH("ProductId")}
${createTH("Product")}
${createTH("Cost")}
${createTH("Reduction")}
${createTH("Link")}
</tr>""","",
"</table>")
Run Code Online (Sandbox Code Playgroud)
例如,数据以 [Row(Name='name'等形式出现。需要知道如何将这些 Row 键值映射到列标题,因为它在上面的 Scala 中。
编辑:
预期输入:
data = spark.sql("select * from test")
Run Code Online (Sandbox Code Playgroud)
来自 sql 示例数据框的数据:
姓名=jon,email=email.com,电话=324234,productId=1234,product=new,cost=500,stillInStock=y)
在 Scala 中调用上面编写的 resultsOfReport 方法:
html_returned=resultsOfReport(data)
Run Code Online (Sandbox Code Playgroud)
预期的输出会给我 html 格式,正如我上面在 Scala 中给出的那样。
我想这是很简单的第一功能转化为自己的Python的等价物:create_td,create_td_double,create_the_link和create_th。
函数runReport可以写成如下。您可以使用该类型,List[Row]因为您不能像在 Scala 中将 DataFrame 转换为 dataclass 到 case class:
from typing import List
from pyspark.sql.types import Row
def run_report(elements: List[Row]) -> str:
table_header = f"""<table class="gmail-relative-table gmail-confluenceTable gmail-tablesorter gmail-tablesorter-default" style="border-collapse:collapse; margin:0px;overflow-x:auto;width:1200px"><tr>
{create_th("Name")}
{create_th("Email")}
{create_th("Phone")}
{create_th("ProductId")}
{create_th("Product")}
{create_th("Cost")}
{create_th("Reduction")}
{create_th("Link")}</tr>"""
tables_tds = [
f"""<tr>{create_td(el.name)}{create_td(el.email)}{create_td(el.phone)}{create_td(el.productId)}{create_td(el.product)}{create_td_double(el.cost)}{create_td_double(el.reduction)}{create_the_link(el.productId)}{create_td("Link to product")}</tr>"""
for el in elements
]
return table_header + "".join(tables_tds) + "</table>"
Run Code Online (Sandbox Code Playgroud)
使用它:
data = spark.sql("select * from test").collect()
html_returned = run_report(data)
Run Code Online (Sandbox Code Playgroud)
请注意,collect不应将其用于大型 DataFrame(我认为对于此用例而言它不是很大)。
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |