Pyspark 如何制作好可复制的Apache Spark示例

Pyspark 如何制作好可复制的Apache Spark示例,pyspark,spark-dataframe,dataframe,apache-spark,apache-spark-sql,Pyspark,Spark Dataframe,Dataframe,Apache Spark,Apache Spark Sql,我花了相当多的时间阅读了一些带有和标签的问题,我经常发现海报并没有提供足够的信息来真正理解他们的问题。我通常会要求他们发表评论,但有时让他们展示一些示例输入/输出数据就像拔牙一样 也许部分问题在于人们不知道如何轻松地为spark数据帧创建MCVE。我认为有一个spark dataframe版本作为可以链接的指南会很有用 那么,如何创建一个好的、可重复的示例呢?\p>####提供可以轻松重新创建的小样本数据。 至少,海报应该在其数据框架和代码上提供一些行和列,以便轻松创建。简单,我指的是剪切和粘贴

我花了相当多的时间阅读了一些带有和标签的问题,我经常发现海报并没有提供足够的信息来真正理解他们的问题。我通常会要求他们发表评论,但有时让他们展示一些示例输入/输出数据就像拔牙一样

也许部分问题在于人们不知道如何轻松地为spark数据帧创建MCVE。我认为有一个spark dataframe版本作为可以链接的指南会很有用

那么,如何创建一个好的、可重复的示例呢?

\p>####提供可以轻松重新创建的小样本数据。 至少,海报应该在其数据框架和代码上提供一些行和列,以便轻松创建。简单,我指的是剪切和粘贴。尽可能小地展示你的问题


我有以下数据帧:

+-----+---+-----+----------+
|索引| X |标签|日期|
+-----+---+-----+----------+
|1 | 1 | A | 2017-01-01|
|2 | 3 | B | 2017-01-02|
|3 | 5 | A | 2017-01-03|
|4 | 7 | B | 2017-01-04|
+-----+---+-----+----------+
可使用此代码创建的:

df=sqlCtx.createDataFrame(
[
(1,1,'A','2017-01-01'),
(2,3,'B','2017-01-02'),
(3,5,'A','2017-01-03'),
(4,7,'B','2017-01-04')
],
(‘索引’、‘X’、‘标签’、‘日期’)
)

###显示所需的输出。 询问您的具体问题,并向我们展示您想要的输出


如果
'date'
的月日加上7天可被
'X'
列中的值整除,否则
'no'
如何创建一个值为
'yes'
的新列

期望输出:

+-----+---+-----+----------+------------+
|索引| X |标签|日期|可除|
+-----+---+-----+----------+------------+
|1 | 1 | A | 2017-01-01 |是|
|2 | 3 | B | 2017-01-02 |是|
|3 | 5 | A | 2017-01-03 |是|
|4 | 7 | B | 2017-01-04 |编号|
+-----+---+-----+----------+------------+

###解释如何获得输出。 详细解释你是如何得到你想要的结果的。这有助于显示一个计算示例


例如,在第1行中,X=1,日期=2017-01-01。截至2017年1月8日,新增7天收益率。一个月的日期是8,因为8可以被1整除,所以答案是“是”

同样,最后一行X=7,日期=2017-01-04。将7添加到日期中,得到11作为当月的日期。因为11%7不是0,所以答案是“否”


###共享您现有的代码。 向我们展示您所做或尝试的内容,包括代码的所有部分,即使它不起作用。告诉我们您在哪里被卡住,如果您收到错误,请包括错误消息

(*您可以省略创建spark上下文的代码,但应包括所有导入。)


我知道如何添加一个新列,即
date
加上7天,但我很难将月份的日期作为整数

从pyspark.sql导入函数为f
df.带列(“下一周”,f.date\U add(“日期”,7))

###包括版本、导入和使用语法高亮显示

  • 全部细节由作者书面提供

###对于性能调整帖子,包括执行计划

  • 全部细节由作者书面提供
  • 它有助于为上下文使用标准化名称

###解析spark输出文件

  • 中提供了帮助将Spark输出文件解析为数据帧的有用代码

###其他注释

  • 一定要先阅读和阅读
  • 阅读这个问题的其他答案,这些答案链接在上面
  • 有一个好的,描述性的标题
  • 要有礼貌。SO上的人都是志愿者,所以好好问问

对已经提供的内容提出一些补充建议:

包括你的Spark版本 Spark仍在发展中,尽管没有1.x时代那么快。包含您的工作版本始终是一个好主意(尤其是当您使用的是较旧的版本时)。就我个人而言,我总是从以下几点开始回答:

spark.version
#u'2.2.0'

sc.version
#u'2.2.0'
包括Python版本也不是一个坏主意


包括你所有的进口商品 如果您的问题不完全是关于Spark SQL和dataframes的,例如,如果您打算在某些机器学习操作中使用您的dataframe,请明确说明您的导入-请参阅,导入仅在(现在已删除)注释中广泛交换后才添加到OP中(事实证明,这些错误的进口是问题的根本原因)

为什么这是必要的?因为,例如,这个LDA

从pyspark.mllib.clustering导入LDA
与此LDA不同:

从pyspark.ml.xml导入LDA
第一个来自旧的、基于RDD的API(以前称为Spark MLlib),而第二个来自新的、基于数据帧的API(Spark ML)


包括代码突出显示 好吧,我承认这是主观的:我认为PySpark问题在默认情况下不应该标记为
python
;问题是,
python
标记会自动突出显示代码(我相信这是那些使用PySpark问题的人的主要原因)。无论如何,如果您碰巧同意,并且您仍然想要一个漂亮、突出显示的代码,只需包含相关的降价指令:

在您的文章中的某个地方,在您的第一个代码片段之前

[更新:为
pyspark
sparkr
标记自动突出显示语法,这已经实现了]

性能调整 如果
val lines: RDD[String] = sc.textFile("path")
val words: RDD[String] = lines.flatMap(_.split(" "))
val lines = sc.textFile("path")
val words = lines.flatMap(_.split(" "))
scala> val rdd = sc.textFile("README.md")
rdd: org.apache.spark.rdd.RDD[String] = README.md MapPartitionsRDD[1] at textFile at <console>:24

scala> :t rdd
org.apache.spark.rdd.RDD[String]
from pyspark.sql.functions import *

def read_spark_output(file_path):
    step1 = spark.read \
             .option("header","true") \
             .option("inferSchema","true") \
             .option("delimiter","|") \
             .option("parserLib","UNIVOCITY") \
             .option("ignoreLeadingWhiteSpace","true") \
             .option("ignoreTrailingWhiteSpace","true") \
             .option("comment","+") \
             .csv("file://{}".format(file_path))
    # select not-null columns
    step2 = t.select([c for c in t.columns if not c.startswith("_")])
    # deal with 'null' string in column
    return step2.select(*[when(~col(col_name).eqNullSafe("null"), col(col_name)).alias(col_name) for col_name in step2.columns])
// read Spark Output Fixed width table:
def readSparkOutput(filePath: String): org.apache.spark.sql.DataFrame = {
  val step1 = spark.read
    .option("header", "true")
    .option("inferSchema", "true")
    .option("delimiter", "|")
    .option("parserLib", "UNIVOCITY")
    .option("ignoreLeadingWhiteSpace", "true")
    .option("ignoreTrailingWhiteSpace", "true")
    .option("comment", "+")
    .csv(filePath)

  val step2 = step1.select(step1.columns.filterNot(_.startsWith("_c")).map(step1(_)): _*)

  val columns = step2.columns
  columns.foldLeft(step2)((acc, c) => acc.withColumn(c, when(col(c) =!= "null", col(c))))
}
df = read_spark_output("file:///tmp/spark.out")