定义抽象实例属性的最佳实践是什么,而不是属性?
我想写一些类似的东西:
class AbstractFoo(metaclass=ABCMeta):
@property
@abstractmethod
def bar(self):
pass
class Foo(AbstractFoo):
def __init__(self):
self.bar = 3
Run Code Online (Sandbox Code Playgroud)
代替:
class Foo(AbstractFoo):
def __init__(self):
self._bar = 3
@property
def bar(self):
return self._bar
@bar.setter
def setbar(self, bar):
self._bar = bar
@bar.deleter
def delbar(self):
del self._bar
Run Code Online (Sandbox Code Playgroud)
属性很方便,但对于不需要计算的简单属性,它们是一种过度杀伤.这对于将由用户进行子类化和实现的抽象类尤其重要(我不想强迫某人@property
在他刚写入self.foo = foo
时使用__init__
).
Python问题中的抽象属性建议仅作为使用的答案,@property
并且@abstractmethod
:它不回答我的问题.
抽象类属性的ActiveState配方AbstractAttribute
可能是正确的方法,但我不确定.它也只适用于类属性而不适用于实例属性.
例如,我想将列中等于0.2的所有数字替换为0.如何在Scala中执行此操作?谢谢
编辑:
|year| make|model| comment |blank|
|2012|Tesla| S | No comment | |
|1997| Ford| E350|Go get one now th...| |
|2015|Chevy| Volt| null | null|
Run Code Online (Sandbox Code Playgroud)
这是我的Dataframe我试图将make栏中的特斯拉改为S.
我withColumn
在Spark-Scala环境中遇到了一些问题.我想在我的DataFrame中添加一个新列,如下所示:
+---+----+---+
| A| B| C|
+---+----+---+
| 4|blah| 2|
| 2| | 3|
| 56| foo| 3|
|100|null| 5|
+---+----+---+
Run Code Online (Sandbox Code Playgroud)
成为:
+---+----+---+-----+
| A| B| C| D |
+---+----+---+-----+
| 4|blah| 2| 750|
| 2| | 3| 750|
| 56| foo| 3| 750|
|100|null| 5| 750|
+---+----+---+-----+
Run Code Online (Sandbox Code Playgroud)
对于我的DataFrame中的每一行,一列中的列D重复N次.
代码是这样的:
var totVehicles : Double = df_totVehicles(0).getDouble(0); //return 750
Run Code Online (Sandbox Code Playgroud)
变量totVehicles返回正确的值,它的工作原理!
第二个DataFrame必须计算2个字段(id_zipcode,n_vehicles),并添加第三列(具有相同的值-750):
var df_nVehicles =
df_carPark.filter(
substring($"id_time",1,4) < 2013
).groupBy(
$"id_zipcode"
).agg(
sum($"n_vehicles") as 'n_vehicles
).select(
$"id_zipcode" as 'id_zipcode,
'n_vehicles …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Pyspark 和 Dataframes,我想大致了解 Dataframe 是否大于某物。
我正在尝试使用countApprox()
功能:
df.rdd.countApprox(1000, 0.5)
Run Code Online (Sandbox Code Playgroud)
但似乎在 Pyspark 中超时不起作用。我已经看到在 Scala/Java 中,函数返回一个对象,您可以在其中检查“低”和“高”值,但在 Pyspark 中只返回一个整数。当数据框“大”时,countApprox()
即使我将超时设置为 1000 毫秒,也需要几分钟才能获得
有谁知道countApprox()
工作是否不同,或者是否有任何其他函数可以知道数据帧的大小而不是行数的近似值?我只需要知道 Dataframe 是“非常小”还是“非常大”。
谢谢。
*大家好,
我对大家有一个简单的问题。我有一个使用createStream方法从kafka流创建的RDD。现在我想在转换为数据帧之前将时间戳记作为此rdd的值添加。我尝试使用withColumn()向数据框添加值,但返回此错误*
val topicMaps = Map("topic" -> 1)
val now = java.util.Calendar.getInstance().getTime()
val messages = KafkaUtils.createStream[String, String, StringDecoder, StringDecoder](ssc, kafkaConf, topicMaps, StorageLevel.MEMORY_ONLY_SER)
messages.foreachRDD(rdd =>
{
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
val dataframe = sqlContext.read.json(rdd.map(_._2))
val d =dataframe.withColumn("timeStamp_column",dataframe.col("now"))
Run Code Online (Sandbox Code Playgroud)
val d = dataframe.withColumn(“ timeStamp_column”,dataframe.col(“ now”))org.apache.spark.sql.AnalysisException:无法解析(动作,device_os_ver,device_type,event_name,item_name,lat, ,lon,memberid,productUpccd,tenantid);在org.apache.spark.sql.DataFrame $$ anonfun $ resolve $ 1.apply(DataFrame.scala:15
据我所知,DataFrames不可更改,因为它们是不可变的,但RDD也是不可变的。那么什么是最好的方法。如何将值添加到RDD(将时间戳动态添加到RDD)。